Эх сурвалжийг харах

标志的相关接口接入

JXDS18FUJT 2 жил өмнө
parent
commit
cf38571f19

+ 4 - 1
src/api/index.ts

@@ -2,10 +2,13 @@
 import login from './login/login'
 import open from './open/open'
 import question from './question/question'
+import traffic from './traffic/traffic'
 const api  = {
     login,
     open,
-    question
+    question,
+    traffic
+
     
 
 

+ 2 - 1
src/api/request.ts

@@ -3,8 +3,9 @@ import { AxiosRequestConfig, AxiosResponse } from 'axios'
 import { message, Modal } from 'ant-design-vue';
 import router from '@/router';
 const request = axios.create({
-	baseURL: process.env.NODE_ENV === "development" ? "https://jpcj1.zzxcx.net/stage-api/" : "https://jpcj.zzxcx.net/prod-api/",
+	baseURL: process.env.NODE_ENV === "development" ? "https://jpcj1.zzxcx.net/stage-api/" : "https://jpcj1.zzxcx.net/stage-api/",
 });
+// "https://jpcj.zzxcx.net/prod-api/"
 request.interceptors.request.use((config) => {
 	console.log(config)
 	const token = window.localStorage.getItem("token")

+ 23 - 0
src/api/traffic/traffic.ts

@@ -0,0 +1,23 @@
+import request from "../request"
+import { trafficApi } from "./type"
+export default {
+    trafficClassList():Promise<trafficApi.classList>{
+        return request({
+            url:"/traffic/class/list",
+            method:'get'
+        })
+
+    },
+    trafficSignList(params:{
+        parentId:number,
+
+    }):Promise<trafficApi.signList>{
+        return request({
+            url:"/traffic/sign/list",
+            method:'get',
+            params
+        })
+    }
+
+
+}

+ 31 - 0
src/api/traffic/type.d.ts

@@ -0,0 +1,31 @@
+interface Res {
+    code: number,
+    msg: string
+
+}
+export declare namespace trafficApi {
+    interface classList extends Res {
+        rows: {
+            createTime: string,
+            updateTime: string,
+            id: number,
+            signClassName: string,
+            seq: number,
+            signUrl: string
+        }[]
+
+    }
+    interface signList extends Res {
+        rows: {
+            createTime: string,
+            updateTime: string,
+            id: number,
+            signName: string,
+            seq: number,
+            signUrl: string
+            parentId:number
+        }[]
+
+    }
+
+}

+ 3 - 0
src/hooks/exam/driverExam.ts

@@ -3,6 +3,7 @@ import { openApi } from "@/api/open/type";
 import moment from 'moment';
 import audio from "@/utils/audio";
 import { useStore } from "vuex";
+import { message } from "ant-design-vue";
 export const useDriverExam = (requestFn: Promise<openApi.selectFreeQuestionInfoRes>, config = {
   countDown: true,
   autoAnswer: true
@@ -780,6 +781,7 @@ export const useDriverExam = (requestFn: Promise<openApi.selectFreeQuestionInfoR
   }
 
   onMounted(() => {
+    message.loading('题目加载中',0)
     requestFn.then(res => {
       res.rows.forEach((element) => {
         element.optsArr = element.opts.split("-");
@@ -790,6 +792,7 @@ export const useDriverExam = (requestFn: Promise<openApi.selectFreeQuestionInfoR
         }
       });
       list.value = res.rows;
+      message.destroy()
     })
     timerId = window.setInterval(() => {
       if (examTimeMillSeconds === 0) {

+ 10 - 5
src/router/index.ts

@@ -28,15 +28,15 @@ const routes: Array<RouteRecordRaw> = [
     component: () => import('../views/examInstructions/index.vue')
   },
   {
-    path:'/driverExam',
+    path: '/driverExam',
     component: () => import('../views/driverExam/index.vue')
   },
   {
-    path:'/driverExamAnaly',
+    path: '/driverExamAnaly',
     component: () => import('../views/driverExamAnaly/index.vue')
   },
   {
-    path:'/markLine',
+    path: '/markLine',
     component: () => import('../views/markLine/index.vue')
   },
   {
@@ -48,9 +48,14 @@ const routes: Array<RouteRecordRaw> = [
     }, {
       path: 'practiseSelect',
       component: () => import('../views/home/practiseSelect/index.vue')
-    },{
-      path:'markLine',
+    },
+    {
+      path: 'markLine',
       component: () => import('../views/home/markLine/index.vue')
+    },
+    {
+      path: 'selectExamSubject',
+      component: () => import('../views/home/selectExamSubject/index.vue')
     }],
     // route level code-splitting
     // this generates a separate chunk (about.[hash].js) for this route

+ 4 - 3
src/views/driverExam/index.vue

@@ -206,16 +206,17 @@ import mProblemDialog from "@/components/mProblemDialog/index.vue";
 import api from "@/api";
 import { openApi } from "@/api/open/type";
 import { useDriverExam } from "@/hooks/exam/driverExam";
+import { useRoute } from "vue-router";
 export default defineComponent({
   name: "driverExam",
   setup() {
-
+    const route = useRoute()
     return {
       alertVisible: ref(false),
       dialogVisible: ref(false),
       ...useDriverExam(api.open.questionInfoSelectTestK14QuestionInfoList({
-        subject:1,
-        gs:'xc'
+        subject:Number(route.query.subject),
+        gs:route.query.gs as string
       }))
     };
   },

+ 24 - 7
src/views/home/components/leftTab/index.vue

@@ -64,6 +64,8 @@ import { defineComponent, reactive, toRefs } from "vue";
 import sysIcon from "@/assets/img/home/sys_icon.png";
 import xcIcon from "@/assets/img/home/xc_icon.png";
 import mtcIcon from "@/assets/img/home/mtc_icon.png";
+import markIcon from "@/assets/img/home/mark_icon.png";
+import sanliIcon from "@/assets/img/home/sanli_icon.png";
 export default defineComponent({
   setup() {
     const state = reactive({
@@ -99,7 +101,7 @@ export default defineComponent({
             {
               text: "模拟考试",
               isSelect: false,
-              path: "/examInstructions",
+              path: "/home/selectExamSubject",
               query: {
                 subject: 1,
                 liceBus: "1",
@@ -133,7 +135,7 @@ export default defineComponent({
             {
               text: "模拟考试",
               isSelect: false,
-              path: "/examInstructions",
+              path: "/home/selectExamSubject",
               query: {
                 subject: 4,
                 liceBus: "1",
@@ -166,7 +168,7 @@ export default defineComponent({
             {
               text: "模拟考试",
               isSelect: false,
-              path: "/examInstructions",
+              path: "/home/selectExamSubject",
               query: {
                 subject: 1,
                 liceMoto: "1",
@@ -196,7 +198,7 @@ export default defineComponent({
             {
               text: "模拟考试",
               isSelect: false,
-              path: "/examInstructions",
+              path: "/home/selectExamSubject",
               query: {
                 subject: 4,
               },
@@ -206,6 +208,22 @@ export default defineComponent({
           isSelect: false,
           path: "",
         },
+        {
+          text: "三力测试",
+          icon: sanliIcon,
+          children: [],
+          isOpen: false,
+          isSelect: false,
+          path: "/home/markLine",
+        },
+        {
+          text: "标志标线大全",
+          icon: markIcon,
+          children: [],
+          isOpen: false,
+          isSelect: false,
+          path: "/home/markLine",
+        },
       ],
       tabValue: [-1, -1],
     });
@@ -242,9 +260,8 @@ export default defineComponent({
       },
       selectIndex: number
     ) {
-      this.tabValue[1] == -1
-        ? (this.tabValue[1] = selectIndex)
-        : (this.tabValue[1] = -1);
+      this.tabValue[1] = selectIndex;
+
       item.isSelect = !item.isSelect;
       item.isOpen = !item.isOpen;
       if (item.path) {

+ 23 - 7
src/views/home/markLine/index.vue

@@ -1,14 +1,19 @@
 <template>
   <div class="pt21 pl30">
     <div class="content">
-      <div class=" w-full h-full bg-white flex flex-wrap items-start content-start">
+      <div
+        class="w-full h-full bg-white flex flex-wrap items-start content-start"
+      >
         <div
-        v-for="(item,index) in 9"
-        :key="index"
+          v-for="(item, index) in list"
+          :key="index"
           class="bg-white w240 h250 flex justify-center items-center content-center flex-wrap mb20"
         >
-          <img class="w150" src="@/assets/img/home/forbidden_mark.png" />
-          <div class="font-bold w-full mt15">禁令标志</div>
+          <router-link :to="'/markLine?parentId='+item.id+'&signClassName='+item.signClassName">
+            <img class="h150 cursor-pointer" :src="item.signUrl" />
+          </router-link>
+
+          <div class="font-bold w-full mt15">{{ item.signClassName }}</div>
         </div>
       </div>
     </div>
@@ -16,11 +21,22 @@
 </template>
 
 <script lang="ts">
-import { defineComponent } from "vue";
+import api from "@/api";
+import { trafficApi } from "@/api/traffic/type";
+import { defineComponent, onMounted, ref } from "vue";
 
 export default defineComponent({
   setup() {
-    return {};
+    onMounted(() => {
+      api.traffic.trafficClassList().then((res) => {
+        list.value = res.rows;
+      });
+    });
+    let list = ref<trafficApi.classList["rows"]>([]);
+
+    return {
+      list,
+    };
   },
 });
 </script>

+ 11 - 4
src/views/home/practiseSelect/index.vue

@@ -2,7 +2,7 @@
 
 <template>
   <div class="content">
-    <div class="h885 overflow-scroll bg-white pl50 pt30">
+    <div class="bg-white pl50 pt30">
       <div class="flex items-center">
         <div class="vertical-line mr10"></div>
         <span class="font20 font-bold mr15">技巧练习</span>
@@ -24,7 +24,11 @@
               >
                 视频
               </div>
-              <router-link :to="'/studySkill?subject=1&classIssue='+(item.classIssue||'')">
+              <router-link
+                :to="
+                  '/studySkill?subject=1&classIssue=' + (item.classIssue || '')
+                "
+              >
                 <div
                   class="w64 lh34 mr15 round4 overflow-hidden select-border2"
                 >
@@ -51,9 +55,11 @@
 <script lang="ts">
 import { defineComponent, ref } from "vue";
 import api from "@/api";
+import { useRoute } from "vue-router";
 export default defineComponent({
-  name:"practiseSelect",
+  name: "practiseSelect",
   setup() {
+    const route = useRoute();
     let list = ref<
       {
         createTime?: string;
@@ -64,9 +70,10 @@ export default defineComponent({
     >([]);
     api.question
       .questionInfoSelectFlQuestionInfo({
-        subject: 1
+        subject: Number(route.query.subject),
       })
       .then((res) => {
+        res.data.shift();
         list.value = res.data;
       });
 

+ 113 - 0
src/views/home/selectExamSubject/index.vue

@@ -0,0 +1,113 @@
+<template>
+  <div class="content">
+    <div class="bg-white pl50 pt30">
+      <div class="flex items-center">
+        <div class="vertical-line mr10"></div>
+        <span class="font20 font-bold mr15">仿真模拟考试</span>
+        <span>(注意科目四,各车型一样)</span>
+        <div class="flex">
+          <div
+            @click="goDriveExam('xc')"
+            class="lh34 ml15 select-border1 round4 pr15 pl15"
+          >
+            轿车
+          </div>
+          <div
+            @click="goDriveExam('kc')"
+            class="lh34 ml15 select-border1 round4 pr15 pl15"
+          >
+            客车
+          </div>
+          <div
+            @click="goDriveExam('hc')"
+            class="lh34 ml15 select-border1 round4 pr15 pl15"
+          >
+            货车
+          </div>
+        </div>
+        <div class="lh34 ml15 select-border1 round4 pr15 pl15">错误回顾</div>
+      </div>
+      <div class="flex items-center pt30 pb30">
+        <div class="vertical-line mr10"></div>
+        <span class="font20 font-bold mr15">全部错误题回顾</span>
+        <div class="lh34 round4 pr15 pl15 select-border1 mr15">错误回顾</div>
+        <div class="lh34 round4 pr15 pl15 select-border1">清空全部错题</div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from "vue";
+
+export default defineComponent({
+  setup() {
+
+    return {
+
+    };
+  },
+  methods: {
+    goDriveExam(gs:string) {
+      this.$router.push({
+        path:'/driverExam',
+        query:{
+          gs:gs,
+          ...this.$route.query
+        }
+
+      })
+      
+    }
+  },
+});
+</script>
+
+<style lang="scss" scoped>
+.select-border1 {
+  border: 1px solid #f9de5b;
+}
+.select-border2 {
+  border: 1px solid #f9de5b;
+}
+.select-border3 {
+  border: 1px solid #d8d8d8;
+}
+.select-border1:hover {
+  border: 1px solid #f9de5b;
+  background-color: #f9de5b;
+  cursor: pointer;
+}
+.select-border2:hover {
+  border: 1px solid #f9de5b;
+  background-color: rgba(255, 247, 204, 1);
+  cursor: pointer;
+}
+.radius4 {
+  border-radius: 4px;
+}
+.bg-primary-yellow {
+  background-color: #f9de5b;
+}
+.bg-light-yellow {
+  background: #fff7cc;
+}
+
+.w1603 {
+  width: 1603px;
+}
+
+.content {
+  padding: 0 30px;
+  padding-top: 21px;
+  padding-bottom: 30px;
+
+  .vertical-line {
+    width: 5px;
+    height: 20px;
+    background: #f9de5b;
+    border-radius: 4px 4px 4px 4px;
+    opacity: 1;
+  }
+}
+</style>

+ 35 - 8
src/views/markLine/index.vue

@@ -1,27 +1,36 @@
 <template>
   <div class="100vw">
     <div class="relative w-full mt50">
-      <span class="font24 font-bold lh40">指示标志</span>
+      <span class="font24 font-bold lh40">{{ query.signClassName }}</span>
       <div
-        class="right30 w72 lh40 h40 absolute right0 top0 bg-primary-yellow flex items-center justify-center"
+        @click="
+          () => {
+            $router.back();
+          }
+        "
+        class="right30 w72 lh40 h40 absolute right0 top0 bg-primary-yellow flex items-center justify-center cursor-pointer"
       >
         <img class="w18 h16" src="@/assets/img/markLine/back_icon.png" />
         <span class="ml4">返回</span>
       </div>
     </div>
     <div class="text-left font16">
-      <div class="inline-block text-left ml20">
+      <div
+        v-for="(item, index) in list"
+        :key="index"
+        class="inline-block text-left ml20"
+      >
         <div
-          class="w200 h184 justify-center text-center border-gray pt12 inline-block cursor-pointer"
+          class="w200 h184 justify-center text-center border-gray pt12 inline-block cursor-pointer mb20"
         >
           <div class="w100 h100 margin-center">
-            <preImage :src="forbiddenMark">
+            <preImage :src="item.signUrl">
               <div class="font-bold font24">向左转弯</div>
-              <div class="font24 w-full">5/29</div>
+              <div class="font24 w-full">{{ index }}/{{ list.length }}</div>
             </preImage>
           </div>
 
-          <div class="mt21 font-bold">立交直行和左转弯行驶</div>
+          <div class="mt21 font-bold">{{ item.signName }}</div>
         </div>
       </div>
     </div>
@@ -29,15 +38,33 @@
 </template>
 
 <script lang="ts">
-import { defineComponent } from "vue";
+import { defineComponent, ref } from "vue";
 import preImage from "@/components/preImage/index.vue";
 import forbiddenMark from "@/assets/img/home/forbidden_mark.png";
+import api from "@/api";
+import { trafficApi } from "@/api/traffic/type";
 export default defineComponent({
   setup() {
     return {
       forbiddenMark: forbiddenMark,
+      list: ref<trafficApi.signList["rows"]>([]),
+      query: {
+        parentId: "0",
+        signClassName: "",
+      },
     };
   },
+  mounted() {
+    this.query.parentId = this.$route.query.parentId as string;
+    this.query.signClassName = this.$route.query.signClassName as string;
+    api.traffic
+      .trafficSignList({
+        parentId: Number(this.query.parentId),
+      })
+      .then((res) => {
+        this.list = res.rows;
+      });
+  },
   components: {
     preImage,
   },