index.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <template>
  2. <!-- 用户信息展示 -->
  3. <userData />
  4. <!-- 轮播图 -->
  5. <swiper />
  6. <!-- 用户做题预选界面 -->
  7. <van-tabs class="car-type" line-width="0" animated ref="carTypeRef" @click="carTypeChange">
  8. <van-tab v-for="(carTypeItem, index) in carTypeList" :key="index" :name="carTypeItem.name">
  9. <template #title>
  10. <div class="car-choose">
  11. <m-icon :type="carTypeItem.icon" class="img" />
  12. <span>{{ carTypeItem.cert }}</span>
  13. <span>{{ carTypeItem.name }}</span>
  14. </div>
  15. </template>
  16. <van-tabs class="test-type" animated>
  17. <van-tab :title="sujectItem.name" v-for="(sujectItem, index) in carTypeItem.sujectList" :key="index" :name="sujectItem.name">
  18. <sujectOne v-if="index == 0" :query="{ ...carTypeItem.query, ...sujectItem.query, title: '模拟考试' }"></sujectOne>
  19. <sujectTwo v-if="index == 1" ></sujectTwo>
  20. <sujectThree v-if="index == 2" :query="{ ...carTypeItem.query, ...sujectItem.query, title: '模拟考试' }"></sujectThree>
  21. <sujectOne v-if="index == 3" :query="{ ...carTypeItem.query, ...sujectItem.query, title: '模拟考试' }"></sujectOne>
  22. </van-tab>
  23. </van-tabs>
  24. </van-tab>
  25. </van-tabs>
  26. </template>
  27. <script lang="ts" setup>
  28. import sujectOne from "./components/sujectOne.vue";
  29. import sujectTwo from "./components/sujectTwo.vue";
  30. import sujectThree from "./components/sujectThree.vue";
  31. import userData from "./components/userData.vue";
  32. import swiper from "./components/swiper.vue";
  33. import { ref, nextTick, onBeforeMount } from "vue";
  34. import { useLogin, useUpdateUserInfo } from "@/hooks";
  35. import { useStore } from "vuex";
  36. import useWxSign from "@/hooks/wx/sign";
  37. import { Toast } from "vant";
  38. import { useRouter } from "vue-router";
  39. import { openApi } from "@/api/index";
  40. import wx from "weixin-js-sdk-ts";
  41. const store = useStore();
  42. const carTypeRef = ref<any>(null);
  43. const { createWxConfig } = useWxSign();
  44. openApi
  45. .jspapi({
  46. url: '',
  47. })
  48. .then((res) => {
  49. // let wxConfig = {
  50. // debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印
  51. // appId: res.data.data.appId as string, // 必填,公众号的唯一标识
  52. // timestamp: res.data.data.timestamp as number, // 必填,生成签名的时间戳
  53. // nonceStr: res.data.data.nonceStr as string, // 必填,生成签名的随机串
  54. // signature: res.data.data.signature as string, // 必填,签名
  55. // jsApiList: ["previewImage"], // 必填,需要使用的JS接口列表
  56. // openTagList: ["wx-open-launch-weapp"], // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']
  57. // };
  58. wx.config({
  59. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印
  60. appId: res.data.data.appId as string, // 必填,公众号的唯一标识
  61. ...createWxConfig(res.data.data.ticket as string),
  62. jsApiList: ["previewImage"], // 必填,需要使用的JS接口列表
  63. openTagList: ["wx-open-launch-weapp"], // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']
  64. });
  65. wx.error(({errMsg})=>{
  66. // alert('灯光模拟和视频无法跳转')
  67. })
  68. });
  69. //打印环境变量
  70. console.log(import.meta.env.MODE, "环境变量");
  71. nextTick(() => {
  72. carTypeRef.value.scrollTo(store.state.carType);
  73. });
  74. const carTypeChange = (e: string) => {
  75. store.commit("setCatType", e);
  76. };
  77. onBeforeMount(() => {
  78. // const router = useRouter();
  79. // console.log(router.currentRoute.value);
  80. });
  81. const carTypeList = ref([
  82. {
  83. name: "轿车",
  84. cert: "C1/C2/C3",
  85. icon: "jiaoche",
  86. query: { liceCar: 1 },
  87. sujectList: [
  88. {
  89. name: "科目一",
  90. query: {
  91. name: "科目一",
  92. cert: "C1/C2/C3",
  93. vehicle: "小车",
  94. subject: 1,
  95. gs:"xc"
  96. },
  97. },
  98. {
  99. name: "科目二",
  100. query: {
  101. name: "科目二",
  102. cert: "C1/C2/C3",
  103. vehicle: "小车",
  104. subject: 2,
  105. gs:"xc"
  106. },
  107. },
  108. {
  109. name: "科目三",
  110. query: {
  111. name: "科目三",
  112. cert: "C1/C2/C3",
  113. vehicle: "小车",
  114. subject: 3,
  115. gs:"xc"
  116. },
  117. },
  118. {
  119. name: "科目四",
  120. query: {
  121. name: "科目四",
  122. cert: "C1/C2/C3",
  123. vehicle: "小车",
  124. subject: 4,
  125. gs:"xc"
  126. },
  127. },
  128. ],
  129. },
  130. {
  131. name: "客车",
  132. cert: "A1/A3/B1",
  133. icon: "keche",
  134. query: { liceBus: 1 },
  135. sujectList: [
  136. {
  137. name: "科目一",
  138. query: {
  139. name: "科目一",
  140. cert: "A1/A3/B1",
  141. vehicle: "客车",
  142. subject: 1,
  143. gs:"kc"
  144. },
  145. },
  146. {
  147. name: "科目二",
  148. query: {
  149. name: "科目二",
  150. cert: "A1/A3/B1",
  151. vehicle: "客车",
  152. subject: 1,
  153. gs:"kc"
  154. },
  155. },
  156. {
  157. name: "科目三",
  158. query: {
  159. name: "科目三",
  160. cert: "A1/A3/B1",
  161. vehicle: "客车",
  162. subject: 4,
  163. gs:"kc"
  164. },
  165. },
  166. {
  167. name: "科目四",
  168. query: {
  169. name: "科目四",
  170. cert: "A1/A3/B1",
  171. vehicle: "客车",
  172. subject: 4,
  173. gs:"kc"
  174. },
  175. },
  176. ],
  177. },
  178. {
  179. name: "货车",
  180. cert: "A2/B2",
  181. icon: "huoche",
  182. query: { liceTruck: 1 },
  183. sujectList: [
  184. {
  185. name: "科目一",
  186. query: {
  187. name: "科目一",
  188. cert: "A2/B2",
  189. vehicle: "货车",
  190. subject: 1,
  191. gs:"hc"
  192. },
  193. },
  194. {
  195. name: "科目二",
  196. query: {
  197. name: "科目二",
  198. cert: "A2/B2",
  199. vehicle: "货车",
  200. subject: 2,
  201. gs:"hc"
  202. },
  203. },
  204. {
  205. name: "科目三",
  206. query: {
  207. name: "科目三",
  208. cert: "A2/B2",
  209. vehicle: "货车",
  210. subject: 3,
  211. gs:"hc"
  212. },
  213. },
  214. {
  215. name: "科目四",
  216. query: {
  217. name: "科目四",
  218. cert: "A2/B2",
  219. vehicle: "货车",
  220. subject: 4,
  221. gs:"hc"
  222. },
  223. },
  224. ],
  225. },
  226. {
  227. name: "摩托车",
  228. cert: "D/E/F",
  229. icon: "motuoche",
  230. query: { liceMoto: 1 },
  231. sujectList: [
  232. {
  233. name: "科目一",
  234. query: {
  235. name: "科目一",
  236. cert: "D/E/F",
  237. vehicle: "摩托车",
  238. subject: 1,
  239. gs:"mtc"
  240. },
  241. },
  242. {
  243. name: "科目二",
  244. query: {
  245. name: "科目二",
  246. cert: "D/E/F",
  247. vehicle: "摩托车",
  248. subject: 2,
  249. gs:"mtc"
  250. },
  251. },
  252. {
  253. name: "科目三",
  254. query: {
  255. name: "科目三",
  256. cert: "D/E/F",
  257. vehicle: "摩托车",
  258. subject: 3,
  259. gs:"mtc"
  260. },
  261. },
  262. {
  263. name: "科目四",
  264. query: {
  265. name: "科目四",
  266. cert: "D/E/F",
  267. vehicle: "摩托车",
  268. subject: 4,
  269. gs:"mtc"
  270. },
  271. },
  272. ],
  273. },
  274. ]);
  275. </script>
  276. <style lang="scss">
  277. .car-type {
  278. margin: 21px 15px;
  279. --van-tabs-line-height: 88px;
  280. .van-tab--active {
  281. .car-choose {
  282. &::after {
  283. content: "";
  284. width: 100%;
  285. height: 78px;
  286. background-color: royalblue;
  287. position: absolute;
  288. top: 0;
  289. left: 0;
  290. opacity: 0.2;
  291. }
  292. &::before {
  293. content: "";
  294. width: 0px;
  295. height: 0px;
  296. border: 10px solid #000;
  297. border-top-color: royalblue;
  298. border-bottom-color: transparent;
  299. border-left-color: transparent;
  300. border-right-color: transparent;
  301. position: absolute;
  302. bottom: 0;
  303. transform: translateY(50%);
  304. opacity: 0.2;
  305. }
  306. }
  307. }
  308. .test-type {
  309. --van-tabs-line-height: 44px;
  310. }
  311. .car-choose {
  312. display: flex;
  313. justify-content: center;
  314. align-items: center;
  315. flex-direction: column;
  316. .img {
  317. width: 66px;
  318. height: 22px;
  319. }
  320. }
  321. }
  322. </style>