dedsudiyu 2 days ago
parent
commit
8d4d640062

+ 56 - 0
src/api/safetyEducationExaminationNew/index.js

@@ -505,5 +505,61 @@ export function examElExamResultRewardPage(data) {
     data: data
   })
 }
+//学习任务列表
+export function examUserCourseLearningList(data) {
+  return request({
+    url: '/exam/user/course/learning/list',
+    method: 'post',
+    data: data
+  })
+}
+//知识学习列表
+export function examUserCoursewareLearningList(data) {
+  return request({
+    url: '/exam/user/courseware/learning/list',
+    method: 'post',
+    data: data
+  })
+}
+//刷题练习列表
+export function examUserPracticeList(data) {
+  return request({
+    url: '/exam/user/practice/list',
+    method: 'post',
+    data: data
+  })
+}
+//考试/类型数量列表
+export function examUserExamTypeSelectExamType(data) {
+  return request({
+    url: '/exam/user/examType/selectExamType',
+    method: 'post',
+    data: data
+  })
+}
+//在线考试列表
+export function examUserExamList(data) {
+  return request({
+    url: '/exam/user/exam/list',
+    method: 'post',
+    data: data
+  })
+}
+//模拟考试列表
+export function examUserExamMockList(data) {
+  return request({
+    url: '/exam/user/exam/mockList',
+    method: 'post',
+    data: data
+  })
+}
+//我的成绩列表
+export function examElExamUserResultMyScoreListPage(data) {
+  return request({
+    url: '/exam/elExamUserResult/myScoreListPage',
+    method: 'post',
+    data: data
+  })
+}
 
 

BIN
src/assets/ZDimages/basicsModules/image_986222064626770.png


+ 68 - 57
src/views/safetyEducationExaminationNew/safetyEducation/knowledgeLearning/index.vue

@@ -8,7 +8,7 @@
           <p @click="leftCheckButton(index)"
             v-for="(item,index) in letDataList" :key="index"
             class="left-for-p" :class="index==leftDataIndex?'leftCheck':''">
-            {{item.name}}
+            {{item.knowledgePointName}}
           </p>
         </div>
         <div class="right-box">
@@ -21,15 +21,15 @@
                      :inline="true" style="width:100%;">
               <div class="table-top-button-box">
                 <div>
-                  <p :class="shareStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
-                  <p :class="shareStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">未学习</p>
-                  <p :class="shareStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">学习中</p>
-                  <p :class="shareStatus === 3?'check-table-button':''" @click="tableTypeButton(3)">已学完</p>
+                  <p :class="learnStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
+                  <p :class="learnStatus === 0?'check-table-button':''" @click="tableTypeButton(0)">未学习</p>
+                  <p :class="learnStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">学习中</p>
+                  <p :class="learnStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">已学完</p>
                 </div>
               </div>
-              <el-form-item label="" prop="queryParamsData1">
+              <el-form-item label="" prop="knowledgePointId">
                 <el-cascader
-                  v-model="queryParams.queryParamsData1"
+                  v-model="queryParams.knowledgePointId"
                   :options="optionListB"
                   :props="{
                 emitPath:false,
@@ -44,10 +44,10 @@
                   placeholder="知识点"
                 ></el-cascader>
               </el-form-item>
-              <el-form-item label="" prop="queryParamsData2">
+              <el-form-item label="" prop="coursewareName">
                 <el-input
                   maxLength="30"
-                  v-model="queryParams.queryParamsData2"
+                  v-model="queryParams.coursewareName"
                   placeholder="搜索名称"
                   style="width: 200px"
                 />
@@ -58,13 +58,15 @@
           </div>
           <div class="page-content-box">
             <div class="for-max-big-box scrollbar-box">
+              <p class="null-text-p" v-if="!dataList[0]">暂无数据</p>
               <div class="for-big-box" v-for="(item,index) in dataList" :key="index">
-                <img :src="item.data1" alt="未配置封面">
+                <img v-if="item.materialType == 1" :src="item.exampleImg">
+                <img v-else src="@/assets/ZDimages/basicsModules/image_986222064626770.png">
                 <div class="bottom-big-box">
-                  <p class="name-p">{{item.data3}}</p>
-                  <p class="time-p">{{item.data4}}分钟 丨 {{item.data5}}学时 丨 {{item.data6}}积分</p>
+                  <p class="name-p">{{item.coursewareName}}{{item.coursewareName}}</p>
+                  <p class="time-p">{{secondsToMinutes(item.minLearningDuration)}}分钟 丨 {{item.creditHours}}学时 丨 {{item.points}}积分</p>
                 </div>
-                <p class="type-p" :class="item.data2=='1'?'type-p-1':(item.data2=='2'?'type-p-2':(item.data2=='3'?'type-p-3':''))">{{item.data2=='1'?'未学习':(item.data2=='2'?'学习中':(item.data2=='3'?'已学完':''))}}</p>
+                <p class="type-p" :class="item.learnStatus=='0'?'type-p-1':(item.learnStatus=='1'?'type-p-2':(item.learnStatus=='2'?'type-p-3':''))">{{item.learnStatus=='0'?'未学习':(item.learnStatus=='1'?'学习中':(item.learnStatus=='2'?'已学完':''))}}</p>
               </div>
             </div>
             <pagination :page-sizes="[20, 30, 40, 50]"
@@ -85,6 +87,7 @@
   //import { systemUserSelect } from "@/api/commonality/permission";
   //import { getInfo } from "@/api/basicsModules/index";
   //import addPage from "./addPage.vue";
+  import { examUserCoursewareLearningList,examElKnowledgePointTreeList, } from "@/api/safetyEducationExaminationNew/index";
   export default {
     name: 'index',
     //components: {
@@ -94,40 +97,21 @@
       return {
         //页面状态
         pageType: 1,
-        letDataList:[
-          {name:'全部知识点',id:'1'},{name:'全部知识点',id:'2'},
-          {name:'全部知识点',id:'3'},{name:'全部知识点',id:'4'},
-          {name:'全部知识点',id:'5'},{name:'全部知识点',id:'6'},
-          {name:'全部知识点',id:'7'},{name:'全部知识点',id:'8'},
-          {name:'全部知识点',id:'9'},{name:'全部知识点',id:'10'},
-          {name:'全部知识点',id:'11'},{name:'全部知识点',id:'12'},
-          {name:'全部知识点',id:'13'},{name:'全部知识点',id:'14'},
-        ],
+        letDataList:[],
         leftDataIndex:0,
         topButtonIndex:1,
         //下拉列表数据
         optionListB: [],
         //查询条件
-        shareStatus:'',
+        learnStatus:'',
         queryParams: {
           page: 1,
           pageSize: 20,
-          queryParamsData1: '',
-          queryParamsData2: null
+          knowledgePointId: '',
+          coursewareName: null
         },
         //列表数据
-        dataList: [
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'1',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'1',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'2',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'2',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'3',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'3',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'1',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'2',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'3',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'1',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-        ],
+        dataList: [],
         //数据数量
         total: 0,
       }
@@ -137,25 +121,28 @@
     },
     mounted() {
       this.examElKnowledgePointTreeList();
-      //this.getList();
     },
     methods: {
       //左侧列表切换
       leftCheckButton(index){
         if(this.leftDataIndex != index){
           this.$set(this,'leftDataIndex',index);
+          this.$set(this.queryParams, 'knowledgePointId', null);
+          this.$set(this, 'optionListB', this.letDataList[index].children?this.letDataList[index].children:[]);
+          this.handleQuery();
         }
       },
       //顶部切换
       topCheckButton(index){
         if(this.topButtonIndex != index){
           this.$set(this,'topButtonIndex',index);
+          this.handleQuery();
         }
       },
       //切换按钮
       tableTypeButton(val){
-        if(this.shareStatus != val){
-          this.$set(this,'shareStatus',val);
+        if(this.learnStatus !== val){
+          this.$set(this,'learnStatus',val);
           this.handleQuery();
         }
       },
@@ -166,26 +153,25 @@
       },
       //重置按钮
       resetQuery() {
-        this.$set(this, 'dateRange', [])
+        this.$set(this,'learnStatus','');
+        this.$set(this,'topButtonIndex',1);
         this.$set(this, 'queryParams', {
           page: 1,
           pageSize: 20,
-          queryParamsData1: '',
-          queryParamsData2: null
+          knowledgePointId: '',
+          coursewareName: null
         })
         this.getList()
       },
       //获取数据列表
       getList() {
         let obj = JSON.parse(JSON.stringify(this.queryParams))
-        if (this.dateRange[0]) {
-          obj.startTime = this.dateRange[0] + 'T00:00:00'
-          obj.endTime = this.dateRange[1] + 'T23:59:59'
-        } else {
-          obj.startTime = ''
-          obj.endTime = ''
+        if(!this.queryParams.knowledgePointId){
+          obj.knowledgePointId = this.letDataList[this.leftDataIndex].id
         }
-        getListFunction(obj).then(response => {
+        obj.materialType = this.topButtonIndex;
+        obj.learnStatus = this.learnStatus;
+        examUserCoursewareLearningList(obj).then(response => {
           this.$set(this, 'dataList', response.data.records)
           this.$set(this, 'total', response.data.total)
         })
@@ -248,9 +234,18 @@
         examElKnowledgePointTreeList({}).then(response => {
           const list = response.data || [];
           this.formatTreeData(list);
-          this.$set(this, 'optionListB', list);
+          this.$set(this, 'letDataList', list);
+          this.$set(this, 'optionListB', list[0].children?list[0].children:[]);
+          this.getList();
         });
       },
+      //换算分钟
+      secondsToMinutes(totalSeconds) {
+        if (typeof totalSeconds !== 'number' || totalSeconds <= 0) {
+          return 1;
+        }
+        return Math.ceil(totalSeconds / 60);
+      },
     }
   }
 </script>
@@ -264,6 +259,7 @@
         border-bottom:1px solid #dedede;
       }
       .max-big-box{
+        flex:1;
         display: flex;
         overflow: hidden;
         .left-box{
@@ -279,6 +275,11 @@
             font-weight:700;
             font-size:16px;
             line-height:40px;
+            /*单行省略号*/
+            display:block;
+            overflow:hidden;
+            text-overflow:ellipsis;
+            white-space:nowrap;
           }
           .left-for-p:hover{
             background-color: #0183fa;
@@ -334,7 +335,6 @@
               }
               p:nth-child(2){
                 border-left:none;
-                border-right:none;
               }
               p:nth-child(3){
                 border-left:none;
@@ -352,20 +352,27 @@
             }
           }
           .page-content-box{
-            padding:20px 0;
+            padding: 0;
           }
           .for-max-big-box{
             flex:1;
+            .null-text-p{
+              line-height:200px;
+              text-align: center;
+              color:#999;
+              font-size:14px;
+            }
             .for-big-box{
               cursor: pointer;
               display: inline-block;
               width:320px;
-              margin:0 0 20px 20px;
+              margin:20px 0 0 20px;
               border-radius:6px;
               overflow: hidden;
               box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.1);
               position: relative;
               img{
+                display: inline-block;
                 width:320px;
                 height:180px;
               }
@@ -375,6 +382,10 @@
                   line-height:30px;
                   font-size:16px;
                   font-weight:700;
+                  display:block;
+                  overflow:hidden;
+                  text-overflow:ellipsis;
+                  white-space:nowrap;
                 }
                 .time{
                   line-height:30px;
@@ -383,9 +394,9 @@
               }
               .type-p{
                 position: absolute;
-                right:20px;
-                bottom:15px;
-                padding:5px 10px;
+                right:5px;
+                bottom:5px;
+                padding:2px 8px;
                 border-radius:4px;
                 font-size:14px;
               }

+ 46 - 45
src/views/safetyEducationExaminationNew/safetyEducation/learningTasks/index.vue

@@ -8,15 +8,15 @@
                  :inline="true" style="width:100%;">
           <div class="table-top-button-box">
             <div>
-              <p :class="shareStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
-              <p :class="shareStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">未学习</p>
-              <p :class="shareStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">学习中</p>
-              <p :class="shareStatus === 3?'check-table-button':''" @click="tableTypeButton(3)">已学完</p>
+              <p :class="learnStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
+              <p :class="learnStatus === 0?'check-table-button':''" @click="tableTypeButton(0)">未学习</p>
+              <p :class="learnStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">学习中</p>
+              <p :class="learnStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">已学完</p>
             </div>
           </div>
-          <el-form-item label="" prop="queryParamsData1">
+          <el-form-item label="" prop="knowledgePointId">
             <el-cascader
-              v-model="queryParams.queryParamsData1"
+              v-model="queryParams.knowledgePointId"
               :options="optionListB"
               :props="{
                 emitPath:false,
@@ -31,10 +31,10 @@
               placeholder="知识点"
             ></el-cascader>
           </el-form-item>
-          <el-form-item label="" prop="queryParamsData2">
+          <el-form-item label="" prop="courseName">
             <el-input
               maxLength="30"
-              v-model="queryParams.queryParamsData2"
+              v-model="queryParams.courseName"
               placeholder="搜索名称"
               style="width: 200px"
             />
@@ -46,21 +46,22 @@
       <div class="page-content-box">
         <div class="for-max-big-box scrollbar-box">
           <div class="for-big-box" v-for="(item,index) in dataList" :key="index">
-            <img :src="item.data1" alt="未配置封面">
+            <img :src="item.coverAttachmentPath">
             <div class="bottom-big-box">
-              <p class="name-p">{{item.data3}}</p>
-              <p class="time-p">{{item.data4}}分钟 丨 {{item.data5}}学时 丨 {{item.data6}}积分</p>
+              <p class="name-p">{{item.courseName}}</p>
+              <p class="time-p">{{secondsToMinutes(item.totalDuration)}}分钟 丨 {{item.totalCreditHours}}学时 丨 {{item.totalPoints}}积分</p>
               <div class="text-box">
-                <p>已学 {{item.data7}} <span> / 总 {{item.data8}} 课件</span></p>
+                <p>已学 {{item.learnedCoursewareCount}} <span> / 总 {{item.totalCoursewareCount}} 课件</span></p>
               </div>
             </div>
-            <p class="type-p" :class="item.data2=='1'?'type-p-1':(item.data2=='2'?'type-p-2':(item.data2=='3'?'type-p-3':''))">{{item.data2=='1'?'未学习':(item.data2=='2'?'学习中':(item.data2=='3'?'已学完':''))}}</p>
+            <p class="type-p" :class="item.learnStatus=='0'?'type-p-1':(item.learnStatus=='1'?'type-p-2':(item.learnStatus=='2'?'type-p-3':''))">{{item.learnStatus=='0'?'未学习':(item.learnStatus=='1'?'学习中':(item.learnStatus=='2'?'已学完':''))}}</p>
             <el-progress
               class="num-p" type="circle"
               :stroke-width="4"
-              :width="60" :percentage="item.data9">
+              :width="60" :percentage="item.progress">
             </el-progress>
           </div>
+          <p class="null-text-p" v-if="!dataList[0]">暂无数据</p>
         </div>
         <pagination :page-sizes="[20, 30, 40, 50]"
                     v-show="total>0"
@@ -76,7 +77,7 @@
 <script>
   //import { getDicts } from "@/api/commonality/noPermission";
   //import { systemUserSelect } from "@/api/commonality/permission";
-  import { examElKnowledgePointTreeList, } from "@/api/safetyEducationExaminationNew/index";
+  import { examUserCourseLearningList,examElKnowledgePointTreeList, } from "@/api/safetyEducationExaminationNew/index";
   export default {
     name: 'index',
     data() {
@@ -86,26 +87,15 @@
         //下拉列表数据
         optionListB: [],
         //查询条件
-        shareStatus:'',
+        learnStatus:'',
         queryParams: {
           page: 1,
           pageSize: 20,
-          queryParamsData1: '',
-          queryParamsData2: null
+          knowledgePointId: '',
+          courseName: null
         },
         //列表数据
-        dataList: [
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'1',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'1',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'2',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'2',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'3',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'3',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'1',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'2',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'3',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-          {data1:'https://img1.baidu.com/it/u=1480196961,2254893225&fm=253&app=138&f=JPEG?w=800&h=1010',data2:'1',data3:'课程名称',data4:'20',data5:'1',data6:'3',data7:'0',data8:'2',data9:'50',},
-        ],
+        dataList: [],
         //数据数量
         total: 0,
       }
@@ -114,14 +104,14 @@
 
     },
     mounted() {
-      //this.getList();
+      this.getList();
       this.examElKnowledgePointTreeList();
     },
     methods: {
       //切换按钮
       tableTypeButton(val){
-        if(this.shareStatus != val){
-          this.$set(this,'shareStatus',val);
+        if(this.learnStatus !== val){
+          this.$set(this,'learnStatus',val);
           this.handleQuery();
         }
       },
@@ -132,26 +122,20 @@
       },
       //重置按钮
       resetQuery() {
-        this.$set(this, 'dateRange', [])
+        this.$set(this,'learnStatus','');
         this.$set(this, 'queryParams', {
           page: 1,
           pageSize: 20,
-          queryParamsData1: '',
-          queryParamsData2: null
+          knowledgePointId: '',
+          courseName: null
         })
         this.getList()
       },
       //获取数据列表
       getList() {
         let obj = JSON.parse(JSON.stringify(this.queryParams))
-        if (this.dateRange[0]) {
-          obj.startTime = this.dateRange[0] + 'T00:00:00'
-          obj.endTime = this.dateRange[1] + 'T23:59:59'
-        } else {
-          obj.startTime = ''
-          obj.endTime = ''
-        }
-        getListFunction(obj).then(response => {
+        obj.learnStatus = this.learnStatus;
+        examUserCourseLearningList(obj).then(response => {
           this.$set(this, 'dataList', response.data.records)
           this.$set(this, 'total', response.data.total)
         })
@@ -217,6 +201,13 @@
           this.$set(this, 'optionListB', list);
         });
       },
+      //换算分钟
+      secondsToMinutes(totalSeconds) {
+        if (typeof totalSeconds !== 'number' || totalSeconds <= 0) {
+          return 1;
+        }
+        return Math.ceil(totalSeconds / 60);
+      },
     }
   }
 </script>
@@ -250,7 +241,6 @@
           }
           p:nth-child(2){
             border-left:none;
-            border-right:none;
           }
           p:nth-child(3){
             border-left:none;
@@ -272,6 +262,12 @@
       }
       .for-max-big-box{
         flex:1;
+        .null-text-p{
+          line-height:200px;
+          text-align: center;
+          color:#999;
+          font-size:14px;
+        }
         .for-big-box{
           cursor: pointer;
           display: inline-block;
@@ -282,6 +278,7 @@
           box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.1);
           position: relative;
           img{
+            display: inline-block;
             width:370px;
             height:180px;
           }
@@ -291,6 +288,10 @@
               line-height:30px;
               font-size:16px;
               font-weight:700;
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
             }
             .time{
               line-height:30px;

+ 78 - 55
src/views/safetyEducationExaminationNew/safetyTest/mockExam/index.vue

@@ -4,25 +4,25 @@
     <div class="page-container mockExamPage" v-if="pageType === 1">
       <p class="pageTitle">模拟考试</p>
       <div class="top-max-button-box scrollbar-x-box">
-        <p :class="topCheckId == item.id?'check-button':''"
-           @click="topCheckButton(item.id)"
-           v-for="(item,index) in topDataList" :key="index">{{item.label}} {{item.num}}</p>
+        <p :class="examTypeId == item.examTypeId?'check-button':''"
+           @click="topCheckButton(item.examTypeId)"
+           v-for="(item,index) in topDataList" :key="index">{{item.examTypeName}} {{item.examTypeCount}}</p>
       </div>
       <div class="page-form-title-box">
         <el-form :model="queryParams" class="form-box" ref="queryForm"
                  :inline="true" style="width:100%;">
           <div class="table-top-button-box">
             <div>
-              <p :class="shareStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
-              <p :class="shareStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">未开始</p>
-              <p :class="shareStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">进行中</p>
-              <p :class="shareStatus === 3?'check-table-button':''" @click="tableTypeButton(3)">已完成</p>
+              <p :class="examStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
+              <p :class="examStatus === 0?'check-table-button':''" @click="tableTypeButton(0)">未开始</p>
+              <p :class="examStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">进行中</p>
+              <p :class="examStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">已完成</p>
             </div>
           </div>
-          <el-form-item label="" prop="queryParamsData1">
+          <el-form-item label="" prop="searchValue">
             <el-input
               maxLength="30"
-              v-model="queryParams.queryParamsData1"
+              v-model="queryParams.searchValue"
               placeholder="搜索名称"
               style="width: 200px"
             />
@@ -48,15 +48,16 @@
         <div class="for-max-big-box scrollbar-box">
           <div class="for-big-box" v-for="(item,index) in dataList" :key="index">
             <div class="top-box">
-              <p class="title-p">{{item.data1}}</p>
-              <p class="text-p" v-if="item.data5">满足前置条件后可参加考试</p>
+              <p class="title-p">{{item.examTypeName}}</p>
+              <p class="text-p" v-if="item.conditionType != 4">满足前置条件后可参加考试</p>
+              <p class="text-p" v-else>已满足前置条件,可参加考试</p>
             </div>
             <div class="bottom-box">
-              <p class="text-big-p">{{item.data2}}</p>
-              <p class="text-p">{{item.data3}} 至 {{item.data4}}</p>
-              <p class="time-p">时长:{{item.data6}}分钟 丨 总分:{{item.data7}}分 丨 及格分:{{item.data8}}分 丨 可考试次数:{{item.data9}}次</p>
+              <p class="text-big-p">{{item.examName}}</p>
+              <p class="text-p">{{parseTime(item.startTime,"{y}-{m}-{d} {h}:{i}")}} 至 {{parseTime(item.endTime,"{y}-{m}-{d} {h}:{i}")}}</p>
+              <p class="time-p">时长:{{item.answerDuration}}分钟 丨 总分:{{item.totalScore}}分 丨 及格分:{{item.passScore}}分 丨 可考试次数:{{item.attemptLimit==0?'无限':item.attemptLimit}}次</p>
             </div>
-            <p class="position-p-1" v-if="item.data5" @click="tableButton(1)">完成模拟考试练习后解锁</p>
+            <p class="position-p-1" @click="tableButton(1)">{{item.conditionType!=4?'完成模拟考试练习后解锁':'开始模拟考试'}}</p>
             <p class="position-p-2" v-if="item.data10" @click="tableButton(2)">历史错题</p>
           </div>
         </div>
@@ -79,6 +80,7 @@
   //import { getInfo } from "@/api/basicsModules/index";
   //import addPage from "./addPage.vue";
   import historyOfIncorrectQuestions from "@/views/safetyEducationExaminationNew/components/historyOfIncorrectQuestions.vue";
+  import { examUserExamMockList,examUserExamTypeSelectExamType, } from "@/api/safetyEducationExaminationNew/index";
   export default {
     name: 'index',
     components: {
@@ -90,45 +92,40 @@
         //页面状态
         pageType: 1,
         //横向列表
-        topDataList:[
-          {label:'全部',id:'1',num:'10'},{label:'全部',id:'2',num:'10'},{label:'全部',id:'3',num:'10'},
-          {label:'全部',id:'4',num:'10'},{label:'全部',id:'5',num:'10'},{label:'全部',id:'6',num:'10'},
-          {label:'全部',id:'1',num:'10'},{label:'全部',id:'2',num:'10'},{label:'全部',id:'3',num:'10'},
-          {label:'全部',id:'4',num:'10'},{label:'全部',id:'5',num:'10'},{label:'全部',id:'6',num:'10'},
-        ],
+        topDataList:[],
         //查询条件
-        topCheckId:'1',
-        shareStatus:'',
+        examTypeId:'',
+        examStatus:'',
         queryParams: {
           page: 1,
           pageSize: 20,
-          queryParamsData1: '',
+          searchValue: '',
         },
         //时间数据
         dateRange: [],
         //列表数据
         dataList: [
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:true,
-            data6:'30',data7:'100',data8:'60',data9:'10',data10:true,},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:false,
-            data6:'30',data7:'100',data8:'60',data9:'10',data10:true,},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:true,
-            data6:'30',data7:'100',data8:'60',data9:'10',data10:false,},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:true,
-            data6:'30',data7:'100',data8:'60',data9:'10',data10:true,},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:true,
-            data6:'30',data7:'100',data8:'60',data9:'10',data10:false,},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:false,
-            data6:'30',data7:'100',data8:'60',data9:'10',data10:true,},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:true,
-            data6:'30',data7:'100',data8:'60',data9:'10',data10:false,},
+          { examTypeName:'新生入学考试', examName:'模拟考试名称考试名称考试',
+            startTime:'2026-09-01', endTime:'2026-09-30', data5:true,
+            answerDuration:'30',totalScore:'100',passScore:'60',attemptLimit:'10',data10:true,},
+          { examTypeName:'新生入学考试', examName:'模拟考试名称考试名称考试',
+            startTime:'2026-09-01', endTime:'2026-09-30', data5:false,
+            answerDuration:'30',totalScore:'100',passScore:'60',attemptLimit:'10',data10:true,},
+          { examTypeName:'新生入学考试', examName:'模拟考试名称考试名称考试',
+            startTime:'2026-09-01', endTime:'2026-09-30', data5:true,
+            answerDuration:'30',totalScore:'100',passScore:'60',attemptLimit:'10',data10:false,},
+          { examTypeName:'新生入学考试', examName:'模拟考试名称考试名称考试',
+            startTime:'2026-09-01', endTime:'2026-09-30', data5:true,
+            answerDuration:'30',totalScore:'100',passScore:'60',attemptLimit:'10',data10:true,},
+          { examTypeName:'新生入学考试', examName:'模拟考试名称考试名称考试',
+            startTime:'2026-09-01', endTime:'2026-09-30', data5:true,
+            answerDuration:'30',totalScore:'100',passScore:'60',attemptLimit:'10',data10:false,},
+          { examTypeName:'新生入学考试', examName:'模拟考试名称考试名称考试',
+            startTime:'2026-09-01', endTime:'2026-09-30', data5:false,
+            answerDuration:'30',totalScore:'100',passScore:'60',attemptLimit:'10',data10:true,},
+          { examTypeName:'新生入学考试', examName:'模拟考试名称考试名称考试',
+            startTime:'2026-09-01', endTime:'2026-09-30', data5:true,
+            answerDuration:'30',totalScore:'100',passScore:'60',attemptLimit:'10',data10:false,},
         ],
         //数据数量
         total: 0,
@@ -140,18 +137,19 @@
 
     },
     mounted() {
-      //this.getList();
+      this.examUserExamTypeSelectExamType();
     },
     methods: {
-      topCheckButton(id){
-        if(this.topCheckId != id){
-          this.$set(this,'topCheckId',id);
+      topCheckButton(examTypeId){
+        if(this.examTypeId != examTypeId){
+          this.$set(this,'examTypeId',examTypeId);
+          this.handleQuery()
         }
       },
       //切换按钮
       tableTypeButton(val){
-        if(this.shareStatus != val){
-          this.$set(this,'shareStatus',val);
+        if(this.examStatus !== val){
+          this.$set(this,'examStatus',val);
           this.handleQuery();
         }
       },
@@ -166,13 +164,15 @@
         this.$set(this, 'queryParams', {
           page: 1,
           pageSize: 20,
-          queryParamsData1: '',
+          searchValue: '',
         })
         this.getList()
       },
       //获取数据列表
       getList() {
         let obj = JSON.parse(JSON.stringify(this.queryParams))
+        obj.examTypeId = this.examTypeId;
+        obj.examStatus = this.examStatus;
         if (this.dateRange[0]) {
           obj.startTime = this.dateRange[0] + 'T00:00:00'
           obj.endTime = this.dateRange[1] + 'T23:59:59'
@@ -180,7 +180,7 @@
           obj.startTime = ''
           obj.endTime = ''
         }
-        getListFunction(obj).then(response => {
+        examUserExamMockList(obj).then(response => {
           this.$set(this, 'dataList', response.data.records)
           this.$set(this, 'total', response.data.total)
         })
@@ -200,7 +200,31 @@
           this.$set(this, 'pageType', 1)
           this.getList()
         }
-      }
+      },
+      examUserExamTypeSelectExamType(){
+        let self = this;
+        examUserExamTypeSelectExamType({examType:2}).then(response => {
+          let num = 0;
+          for(let i=0;i<response.data.length;i++){
+            num = self.accAdd(num,response.data[i].examTypeCount);
+          }
+          let list = [{
+            examTypeId:'',
+            examTypeName:'全部',
+            examTypeCount:num
+          }];
+          this.$set(this,'topDataList',[...list,...response.data])
+          this.getList();
+        })
+      },
+      //加法
+      accAdd(arg1,arg2){
+        var r1,r2,m;
+        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
+        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
+        m=Math.pow(10,Math.max(r1,r2))
+        return ((arg1*m+arg2*m)/m).toFixed(0);
+      },
     }
   }
 </script>
@@ -259,7 +283,6 @@
           }
           p:nth-child(2){
             border-left:none;
-            border-right:none;
           }
           p:nth-child(3){
             border-left:none;

+ 59 - 31
src/views/safetyEducationExaminationNew/safetyTest/myGrades/index.vue

@@ -4,18 +4,18 @@
     <div class="page-container myGradesPage" v-if="pageType === 1">
       <p class="pageTitle">模拟考试</p>
       <div class="top-max-button-box scrollbar-x-box">
-        <p :class="topCheckId == item.id?'check-button':''"
-           @click="topCheckButton(item.id)"
-           v-for="(item,index) in topDataList" :key="index">{{item.label}} {{item.num}}</p>
+        <p :class="examTypeId == item.examTypeId?'check-button':''"
+           @click="topCheckButton(item.examTypeId)"
+           v-for="(item,index) in topDataList" :key="index">{{item.examTypeName}} {{item.examTypeCount}}</p>
       </div>
       <div class="page-form-title-box">
         <el-form :model="queryParams" class="form-box" ref="queryForm"
                  :inline="true" style="width:100%;">
           <div class="table-top-button-box">
             <div>
-              <p :class="shareStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
-              <p :class="shareStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">通过</p>
-              <p :class="shareStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">未通过</p>
+              <p :class="resultStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
+              <p :class="resultStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">通过</p>
+              <p :class="resultStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">未通过</p>
             </div>
           </div>
           <el-form-item label="" prop="state">
@@ -38,18 +38,18 @@
       <div class="page-content-box">
         <div class="for-max-big-box scrollbar-box">
           <div class="for-big-box" v-for="(item,index) in dataList" :key="index">
-            <p class="title-p">{{item.data1}}</p>
-            <p class="text-p">{{item.data2}}</p>
-            <p class="text-p">{{item.data3}}</p>
-            <p class="color-p">时长:{{item.data4}}分钟 丨 总分:{{item.data5}}分 丨 及格分:{{item.data6}}分 丨 考试次数:{{item.data7}}/{{item.data8}}次</p>
+            <p class="title-p">{{item.examTypeName}}</p>
+            <p class="text-p">{{item.examName}}</p>
+            <p class="text-p">{{parseTime(item.startTime,"{y}-{m}-{d} {h}:{i}")}} 至 {{parseTime(item.endTime,"{y}-{m}-{d} {h}:{i}")}}</p>
+            <p class="color-p">时长:{{item.answerDuration}}分钟 丨 总分:{{item.totalScore}}分 丨 及格分:{{item.passScore}}分 丨 考试次数:{{item.attemptCount}}/{{item.attemptLimit==0?'无限':item.attemptLimit}}次</p>
             <div class="color-box">
-              <p>我的用时:{{item.data9}}</p>
-              <p>最高成绩:{{item.data10}}</p>
-              <p>获得积分:{{item.data11}}</p>
-              <p>考试结果:<span :class="item.data12?'colorA':'colorB'">{{item.data12?'通过':'未通过'}}</span></p>
+              <p>我的用时:{{item.myDuration}}</p>
+              <p>最高成绩:{{item.bestScore}}</p>
+              <p>获得积分:{{item.myScore}}</p>
+              <p>考试结果:<span :class="item.resultStatus==2?'colorA':(item.resultStatus==3?'colorB':'')">{{item.resultStatus==1?'考试中':(item.resultStatus==2?'通过':(item.resultStatus==3?'未通过':(item.resultStatus==4?'缺考':'')))}}</span></p>
             </div>
-            <p class="position-p-1" @click="tableButton(1)">考试记录</p>
-            <p class="position-p-2" v-if="item.data12" @click="tableButton(2)">历史错题</p>
+            <p class="position-p-1" v-if="item.resultStatus==2||item.resultStatus==3" @click="tableButton(1)">考试记录</p>
+            <p class="position-p-2" v-if="item.resultStatus==2" @click="tableButton(2)">历史错题</p>
           </div>
         </div>
         <pagination :page-sizes="[20, 30, 40, 50]"
@@ -73,6 +73,7 @@
   //import addPage from "./addPage.vue";
   import historyOfIncorrectQuestions from "@/views/safetyEducationExaminationNew/components/historyOfIncorrectQuestions.vue";
   import examRecords from "@/views/safetyEducationExaminationNew/components/examRecords.vue";
+  import { examElExamUserResultMyScoreListPage,examUserExamTypeSelectExamType, } from "@/api/safetyEducationExaminationNew/index";
   export default {
     name: 'index',
     components: {
@@ -92,8 +93,8 @@
           {label:'全部',id:'4',num:'10'},{label:'全部',id:'5',num:'10'},{label:'全部',id:'6',num:'10'},
         ],
         //查询条件
-        topCheckId:'1',
-        shareStatus:'',
+        examTypeId:'',
+        resultStatus:'',
         queryParams: {
           page: 1,
           pageSize: 20,
@@ -102,27 +103,27 @@
         dateRange: [],
         //列表数据
         dataList: [
-          { data1:'分级分类考试', data2:'考试名称考试名称考试名称',
+          { examTypeName:'分级分类考试', examName:'考试名称考试名称考试名称',
             data3:'2026-09-01  9:30 ~ 2026-09-01 10:00',
             data4:'30',data5:'100',data6:'60',data7:'6',data8:'10',
             data9:'20分16秒',data10:'90',data11:'6',data12:true, },
-          { data1:'分级分类考试', data2:'考试名称考试名称考试名称',
+          { examTypeName:'分级分类考试', examName:'考试名称考试名称考试名称',
             data3:'2026-09-01  9:30 ~ 2026-09-01 10:00',
             data4:'30',data5:'100',data6:'60',data7:'6',data8:'10',
             data9:'20分16秒',data10:'90',data11:'6',data12:false, },
-          { data1:'分级分类考试', data2:'考试名称考试名称考试名称',
+          { examTypeName:'分级分类考试', examName:'考试名称考试名称考试名称',
             data3:'2026-09-01  9:30 ~ 2026-09-01 10:00',
             data4:'30',data5:'100',data6:'60',data7:'6',data8:'10',
             data9:'20分16秒',data10:'90',data11:'6',data12:true, },
-          { data1:'分级分类考试', data2:'考试名称考试名称考试名称',
+          { examTypeName:'分级分类考试', examName:'考试名称考试名称考试名称',
             data3:'2026-09-01  9:30 ~ 2026-09-01 10:00',
             data4:'30',data5:'100',data6:'60',data7:'6',data8:'10',
             data9:'20分16秒',data10:'90',data11:'6',data12:false, },
-          { data1:'分级分类考试', data2:'考试名称考试名称考试名称',
+          { examTypeName:'分级分类考试', examName:'考试名称考试名称考试名称',
             data3:'2026-09-01  9:30 ~ 2026-09-01 10:00',
             data4:'30',data5:'100',data6:'60',data7:'6',data8:'10',
             data9:'20分16秒',data10:'90',data11:'6',data12:true, },
-          { data1:'分级分类考试', data2:'考试名称考试名称考试名称',
+          { examTypeName:'分级分类考试', examName:'考试名称考试名称考试名称',
             data3:'2026-09-01  9:30 ~ 2026-09-01 10:00',
             data4:'30',data5:'100',data6:'60',data7:'6',data8:'10',
             data9:'20分16秒',data10:'90',data11:'6',data12:false, },
@@ -137,18 +138,19 @@
 
     },
     mounted() {
-      //this.getList();
+      this.examUserExamTypeSelectExamType();
     },
     methods: {
-      topCheckButton(id){
-        if(this.topCheckId != id){
-          this.$set(this,'topCheckId',id);
+      topCheckButton(examTypeId){
+        if(this.examTypeId !== examTypeId){
+          this.$set(this,'examTypeId',examTypeId);
+          this.handleQuery()
         }
       },
       //切换按钮
       tableTypeButton(val){
-        if(this.shareStatus != val){
-          this.$set(this,'shareStatus',val);
+        if(this.resultStatus != val){
+          this.$set(this,'resultStatus',val);
           this.handleQuery();
         }
       },
@@ -169,6 +171,8 @@
       //获取数据列表
       getList() {
         let obj = JSON.parse(JSON.stringify(this.queryParams))
+        obj.examTypeId = this.examTypeId;
+        obj.resultStatus = this.resultStatus;
         if (this.dateRange[0]) {
           obj.startTime = this.dateRange[0] + 'T00:00:00'
           obj.endTime = this.dateRange[1] + 'T23:59:59'
@@ -176,7 +180,7 @@
           obj.startTime = ''
           obj.endTime = ''
         }
-        getListFunction(obj).then(response => {
+        examElExamUserResultMyScoreListPage(obj).then(response => {
           this.$set(this, 'dataList', response.data.records)
           this.$set(this, 'total', response.data.total)
         })
@@ -198,6 +202,30 @@
           this.getList()
         }
       },
+      examUserExamTypeSelectExamType(){
+        let self = this;
+        examUserExamTypeSelectExamType({examType:1}).then(response => {
+          let num = 0;
+          for(let i=0;i<response.data.length;i++){
+            num = self.accAdd(num,response.data[i].examTypeCount);
+          }
+          let list = [{
+            examTypeId:'',
+            examTypeName:'全部',
+            examTypeCount:num
+          }];
+          this.$set(this,'topDataList',[...list,...response.data])
+          this.getList();
+        })
+      },
+      //加法
+      accAdd(arg1,arg2){
+        var r1,r2,m;
+        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
+        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
+        m=Math.pow(10,Math.max(r1,r2))
+        return ((arg1*m+arg2*m)/m).toFixed(0);
+      },
     }
   }
 </script>

+ 60 - 60
src/views/safetyEducationExaminationNew/safetyTest/onlineExam/index.vue

@@ -4,19 +4,19 @@
     <div class="page-container onlineExamPage" v-if="pageType === 1">
       <p class="pageTitle">在线考试</p>
       <div class="top-max-button-box scrollbar-x-box">
-        <p :class="topCheckId == item.id?'check-button':''"
-           @click="topCheckButton(item.id)"
-          v-for="(item,index) in topDataList" :key="index">{{item.label}} {{item.num}}</p>
+        <p :class="examTypeId == item.examTypeId?'check-button':''"
+           @click="topCheckButton(item.examTypeId)"
+          v-for="(item,index) in topDataList" :key="index">{{item.examTypeName}} {{item.examTypeCount}}</p>
       </div>
       <div class="page-form-title-box">
         <el-form :model="queryParams" class="form-box" ref="queryForm"
                  :inline="true" style="width:100%;">
           <div class="table-top-button-box">
             <div>
-              <p :class="shareStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
-              <p :class="shareStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">未开始</p>
-              <p :class="shareStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">进行中</p>
-              <p :class="shareStatus === 3?'check-table-button':''" @click="tableTypeButton(3)">已完成</p>
+              <p :class="practiceStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
+              <p :class="practiceStatus === 0?'check-table-button':''" @click="tableTypeButton(0)">未开始</p>
+              <p :class="practiceStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">进行中</p>
+              <p :class="practiceStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">已完成</p>
             </div>
           </div>
           <el-form-item label="" prop="queryParamsData1">
@@ -48,17 +48,17 @@
         <div class="for-max-big-box scrollbar-box">
           <div class="for-big-box" v-for="(item,index) in dataList" :key="index">
             <div class="top-box">
-              <p class="title-p">{{item.data1}}</p>
-              <p class="text-p" v-if="item.data5">满足前置条件后可参加考试</p>
+              <p class="title-p">{{item.examTypeName}}</p>
+              <p class="text-p" v-if="item.conditionType != 4">满足前置条件后可参加考试</p>
+              <p class="text-p" v-else>已满足前置条件,可参加考试</p>
             </div>
             <div class="bottom-box">
-              <p class="text-big-p">{{item.data2}}</p>
-              <p class="text-p">{{item.data3}} 至 {{item.data4}}</p>
-              <p class="time-p">时长:{{item.data6}}分钟 丨 总分:{{item.data7}}分 丨 及格分:{{item.data8}}分 丨 可考试次数:{{item.data9}}次</p>
+              <p class="text-big-p">{{item.examName}}</p>
+              <p class="text-p">{{parseTime(item.startTime,"{y}-{m}-{d} {h}:{i}")}} 至 {{parseTime(item.endTime,"{y}-{m}-{d} {h}:{i}")}}</p>
+              <p class="time-p">时长:{{item.answerDuration}}分钟 丨 总分:{{item.totalScore}}分 丨 及格分:{{item.passScore}}分 丨 可考试次数:{{item.attemptLimit===0?'无限':item.attemptLimit}}次</p>
             </div>
-            <p class="position-p-1"
-               v-if="item.data5" @click="tableButton(1,item)">
-              {{item.data5==1?'完成学时任务后解锁':(item.data5==2?'完成学时要求后解锁':(item.data5==3?'完成考前课程学习后解锁':(item.data5==4?'完成模拟考试练习后解锁':(item.data5==5?'开始考试':''))))}}
+            <p class="position-p-1" @click="tableButton(1,item)">
+              {{item.conditionType==1?'完成学时要求后解锁':(item.conditionType==2?'完成考前课程学习后解锁':(item.conditionType==3?'完成模拟考试练习后解锁':(item.conditionType==4?'开始考试':'')))}}
             </p>
           </div>
         </div>
@@ -81,6 +81,7 @@
   //import { getInfo } from "@/api/basicsModules/index";
   //import addPage from "./addPage.vue";
   import historyOfIncorrectQuestions from "@/views/safetyEducationExaminationNew/components/historyOfIncorrectQuestions.vue";
+  import { examUserExamList,examUserExamTypeSelectExamType, } from "@/api/safetyEducationExaminationNew/index";
   export default {
     name: 'index',
     components: {
@@ -92,15 +93,10 @@
         //页面状态
         pageType: 1,
         //横向列表
-        topDataList:[
-          {label:'全部',id:'1',num:'10'},{label:'全部',id:'2',num:'10'},{label:'全部',id:'3',num:'10'},
-          {label:'全部',id:'4',num:'10'},{label:'全部',id:'5',num:'10'},{label:'全部',id:'6',num:'10'},
-          {label:'全部',id:'1',num:'10'},{label:'全部',id:'2',num:'10'},{label:'全部',id:'3',num:'10'},
-          {label:'全部',id:'4',num:'10'},{label:'全部',id:'5',num:'10'},{label:'全部',id:'6',num:'10'},
-        ],
+        topDataList:[],
         //查询条件
-        topCheckId:'1',
-        shareStatus:'',
+        examTypeId:'',
+        practiceStatus:'',
         queryParams: {
           page: 1,
           pageSize: 20,
@@ -109,29 +105,7 @@
         //时间数据
         dateRange: [],
         //列表数据
-        dataList: [
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:1,
-            data6:'30',data7:'100',data8:'60',data9:'10',},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:2,
-            data6:'30',data7:'100',data8:'60',data9:'10',},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:3,
-            data6:'30',data7:'100',data8:'60',data9:'10',},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:4,
-            data6:'30',data7:'100',data8:'60',data9:'10',},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:5,
-            data6:'30',data7:'100',data8:'60',data9:'10',},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:5,
-            data6:'30',data7:'100',data8:'60',data9:'10',},
-          { data1:'新生入学考试', data2:'模拟考试名称考试名称考试',
-            data3:'2026-09-01', data4:'2026-09-30', data5:5,
-            data6:'30',data7:'100',data8:'60',data9:'10',},
-        ],
+        dataList: [],
         //数据数量
         total: 0,
         //组件传参
@@ -142,18 +116,19 @@
 
     },
     mounted() {
-      //this.getList();
+      this.examUserExamTypeSelectExamType();
     },
     methods: {
-      topCheckButton(id){
-        if(this.topCheckId != id){
-          this.$set(this,'topCheckId',id);
+      topCheckButton(examTypeId){
+        if(this.examTypeId !== examTypeId){
+          this.$set(this,'examTypeId',examTypeId);
+          this.handleQuery()
         }
       },
       //切换按钮
       tableTypeButton(val){
-        if(this.shareStatus != val){
-          this.$set(this,'shareStatus',val);
+        if(this.practiceStatus !== val){
+          this.$set(this,'practiceStatus',val);
           this.handleQuery();
         }
       },
@@ -175,6 +150,8 @@
       //获取数据列表
       getList() {
         let obj = JSON.parse(JSON.stringify(this.queryParams))
+        obj.examTypeId = this.examTypeId;
+        obj.practiceStatus = this.practiceStatus;
         if (this.dateRange[0]) {
           obj.startTime = this.dateRange[0] + 'T00:00:00'
           obj.endTime = this.dateRange[1] + 'T23:59:59'
@@ -182,7 +159,7 @@
           obj.startTime = ''
           obj.endTime = ''
         }
-        getListFunction(obj).then(response => {
+        examUserExamList(obj).then(response => {
           this.$set(this, 'dataList', response.data.records)
           this.$set(this, 'total', response.data.total)
         })
@@ -192,15 +169,15 @@
         let self = this
         if (type == 1) {
           //模拟练习
-          if(item.data5 == 1){
+          if(item.conditionType == 1){
 
-          }else if(item.data5 == 2){
+          }else if(item.conditionType == 2){
 
-          }else if(item.data5 == 3){
+          }else if(item.conditionType == 3){
 
-          }else if(item.data5 == 4){
+          }else if(item.conditionType == 4){
 
-          }else if(item.data5 == 5){
+          }else if(item.conditionType == 5){
 
           }
 
@@ -209,7 +186,31 @@
           this.$set(this, 'pageType', 1)
           this.getList()
         }
-      }
+      },
+      examUserExamTypeSelectExamType(){
+        let self = this;
+        examUserExamTypeSelectExamType({examType:1}).then(response => {
+          let num = 0;
+          for(let i=0;i<response.data.length;i++){
+            num = self.accAdd(num,response.data[i].examTypeCount);
+          }
+          let list = [{
+            examTypeId:'',
+            examTypeName:'全部',
+            examTypeCount:num
+          }];
+          this.$set(this,'topDataList',[...list,...response.data])
+          this.getList();
+        })
+      },
+      //加法
+      accAdd(arg1,arg2){
+        var r1,r2,m;
+        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
+        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
+        m=Math.pow(10,Math.max(r1,r2))
+        return ((arg1*m+arg2*m)/m).toFixed(0);
+      },
     }
   }
 </script>
@@ -268,7 +269,6 @@
           }
           p:nth-child(2){
             border-left:none;
-            border-right:none;
           }
           p:nth-child(3){
             border-left:none;

+ 42 - 56
src/views/safetyEducationExaminationNew/safetyTest/practiceQuestions/index.vue

@@ -8,7 +8,7 @@
           <p @click="leftCheckButton(index)"
              v-for="(item,index) in letDataList" :key="index"
              class="left-for-p" :class="index==leftDataIndex?'leftCheck':''">
-            {{item.name}}
+            {{item.knowledgePointName}}
           </p>
         </div>
         <div class="right-box">
@@ -17,15 +17,15 @@
                      :inline="true" style="width:100%;">
               <div class="table-top-button-box">
                 <div>
-                  <p :class="shareStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
-                  <p :class="shareStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">未开始</p>
-                  <p :class="shareStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">练习中</p>
-                  <p :class="shareStatus === 3?'check-table-button':''" @click="tableTypeButton(3)">已学完</p>
+                  <p :class="practiceStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
+                  <p :class="practiceStatus === 0?'check-table-button':''" @click="tableTypeButton(0)">未开始</p>
+                  <p :class="practiceStatus === 1?'check-table-button':''" @click="tableTypeButton(1)">练习中</p>
+                  <p :class="practiceStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">已学完</p>
                 </div>
               </div>
-              <el-form-item label="" prop="queryParamsData1">
+              <el-form-item label="" prop="knowledgePointId">
                 <el-cascader
-                  v-model="queryParams.queryParamsData1"
+                  v-model="queryParams.knowledgePointId"
                   :options="optionListB"
                   :props="{
                 emitPath:false,
@@ -40,10 +40,10 @@
                   placeholder="知识点"
                 ></el-cascader>
               </el-form-item>
-              <el-form-item label="" prop="queryParamsData2">
+              <el-form-item label="" prop="searchName">
                 <el-input
                   maxLength="30"
-                  v-model="queryParams.queryParamsData2"
+                  v-model="queryParams.searchName"
                   placeholder="搜索名称"
                   style="width: 200px"
                 />
@@ -55,21 +55,20 @@
           <div class="page-content-box">
             <div class="for-max-big-box scrollbar-box">
               <div class="for-big-box" v-for="(item,index) in dataList" :key="index">
-                <p class="title-p">{{item.data1}}{{item.data2?' - '+item.data2:''}}</p>
+                <p class="title-p">{{item.knowledgePointName}}</p>
                 <div class="text-box">
                   <div class="text-min-box">
                     <p class="el-icon-time"></p>
-                    <p>{{item.data3}}</p>
+                    <p :style="!item.lastAnswerTime?'font-size:14px;':''">{{item.lastAnswerTime?parseTime(item.lastAnswerTime,"{y}-{m}-{d} {h}:{i}"):'未练习'}}</p>
                   </div>
-                  <p class="text-p">练习进度:{{item.data4}} / {{item.data5}}</p>
-                  <p class="text-p">正确数:{{item.data6}} 丨 错题数:{{item.data7}} 丨 正确率:{{item.data8}}%</p>
+                  <p class="text-p">练习进度:{{item.answeredCount}} / {{item.totalCount}}</p>
+                  <p class="text-p">正确数:{{item.correctCount}} 丨 错题数:{{item.wrongCount}} 丨 正确率:{{item.correctRate}}%</p>
                 </div>
-                <p class="position-time">{{item.data9}}</p>
-                <p class="position-p" v-if="item.data11" @click="tableButton(1,item)">历史错题</p>
+                <p class="position-p" v-if="item.hasWrongQuestion" @click="tableButton(1,item)">历史错题</p>
                 <el-progress
                   class="num-p" type="circle"
                   :stroke-width="4"
-                  :width="60" :percentage="item.data10">
+                  :width="60" :percentage="item.progress">
                 </el-progress>
               </div>
             </div>
@@ -93,7 +92,7 @@
   //import { systemUserSelect } from "@/api/commonality/permission";
   //import { getInfo } from "@/api/basicsModules/index";
   //import addPage from "./addPage.vue";
-  import { examElKnowledgePointTreeList, } from "@/api/safetyEducationExaminationNew/index";
+  import { examUserPracticeList,examElKnowledgePointTreeList, } from "@/api/safetyEducationExaminationNew/index";
   import historyOfIncorrectQuestions from "@/views/safetyEducationExaminationNew/components/historyOfIncorrectQuestions.vue";
   export default {
     name: 'index',
@@ -104,39 +103,20 @@
       return {
         //页面状态
         pageType: 1,
-        letDataList:[
-          {name:'全部知识点',id:'1'},{name:'全部知识点',id:'2'},
-          {name:'全部知识点',id:'3'},{name:'全部知识点',id:'4'},
-          {name:'全部知识点',id:'5'},{name:'全部知识点',id:'6'},
-          {name:'全部知识点',id:'7'},{name:'全部知识点',id:'8'},
-          {name:'全部知识点',id:'9'},{name:'全部知识点',id:'10'},
-          {name:'全部知识点',id:'11'},{name:'全部知识点',id:'12'},
-          {name:'全部知识点',id:'13'},{name:'全部知识点',id:'14'},
-        ],
+        letDataList:[],
         leftDataIndex:0,
         //下拉列表数据
         optionListB: [],
         //查询条件
-        shareStatus:'',
+        practiceStatus:'',
         queryParams: {
           page: 1,
           pageSize: 20,
-          queryParamsData1: '',
-          queryParamsData2: null
+          knowledgePointId: null,
+          searchName: ''
         },
         //列表数据
-        dataList: [
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'100',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:100,data11:true},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:true},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:false},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:true},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:true},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:false},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:false},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:true},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:false},
-          {data1:'知识点',data2:'二级知识点',data3:'2026-09-1 9:30:33',data4:'33',data5:'369',data6:'3',data7:'3',data8:'69',data9:'2026-09-1 9:30:33',data10:33,data11:false},
-        ],
+        dataList: [],
         //数据数量
         total: 0,
         propsData:{},
@@ -146,7 +126,6 @@
 
     },
     mounted() {
-      //this.getList();
       this.examElKnowledgePointTreeList();
     },
     methods: {
@@ -154,12 +133,15 @@
       leftCheckButton(index){
         if(this.leftDataIndex != index){
           this.$set(this,'leftDataIndex',index);
+          this.$set(this.queryParams, 'knowledgePointId', null);
+          this.$set(this, 'optionListB', this.letDataList[index].children?this.letDataList[index].children:[]);
+          this.handleQuery();
         }
       },
       //切换按钮
       tableTypeButton(val){
-        if(this.shareStatus != val){
-          this.$set(this,'shareStatus',val);
+        if(this.practiceStatus !== val){
+          this.$set(this,'practiceStatus',val);
           this.handleQuery();
         }
       },
@@ -170,26 +152,22 @@
       },
       //重置按钮
       resetQuery() {
-        this.$set(this, 'dateRange', [])
         this.$set(this, 'queryParams', {
           page: 1,
           pageSize: 20,
-          queryParamsData1: '',
-          queryParamsData2: null
+          knowledgePointId: null,
+          searchName: ''
         })
         this.getList()
       },
       //获取数据列表
       getList() {
         let obj = JSON.parse(JSON.stringify(this.queryParams))
-        if (this.dateRange[0]) {
-          obj.startTime = this.dateRange[0] + 'T00:00:00'
-          obj.endTime = this.dateRange[1] + 'T23:59:59'
-        } else {
-          obj.startTime = ''
-          obj.endTime = ''
+        if(!this.queryParams.knowledgePointId){
+          obj.knowledgePointId = this.letDataList[this.leftDataIndex].id
         }
-        getListFunction(obj).then(response => {
+        obj.practiceStatus = this.practiceStatus;
+        examUserPracticeList(obj).then(response => {
           this.$set(this, 'dataList', response.data.records)
           this.$set(this, 'total', response.data.total)
         })
@@ -211,7 +189,9 @@
         examElKnowledgePointTreeList({}).then(response => {
           const list = response.data || [];
           this.formatTreeData(list);
-          this.$set(this, 'optionListB', list);
+          this.$set(this, 'letDataList', list);
+          this.$set(this, 'optionListB', list[0].children?list[0].children:[]);
+          this.getList();
         });
       },
     }
@@ -227,6 +207,7 @@
         border-bottom:1px solid #dedede;
       }
       .max-big-box{
+        flex: 1;
         display: flex;
         overflow: hidden;
         .left-box{
@@ -242,6 +223,11 @@
             font-weight:700;
             font-size:16px;
             line-height:40px;
+            /*单行省略号*/
+            display:block;
+            overflow:hidden;
+            text-overflow:ellipsis;
+            white-space:nowrap;
           }
           .left-for-p:hover{
             background-color: #0183fa;
@@ -297,7 +283,6 @@
               }
               p:nth-child(2){
                 border-left:none;
-                border-right:none;
               }
               p:nth-child(3){
                 border-left:none;
@@ -342,6 +327,7 @@
                 border-radius:10px;
                 padding:10px 20px;
                 .text-min-box{
+                  height:40px;
                   line-height: 40px;
                   color:#0183fa;
                   display: flex;