dedsudiyu před 1 dnem
rodič
revize
c32d3d1b5b
38 změnil soubory, kde provedl 403 přidání a 214 odebrání
  1. 1 0
      package.json
  2. 2 2
      src/assets/styles/button.scss
  3. 141 84
      src/views/safetyEducationExaminationNew/components/videoComponent.vue
  4. 2 2
      src/views/safetyEducationExaminationNew/courseManagement/courseManagement/addPage.vue
  5. 2 2
      src/views/safetyEducationExaminationNew/courseManagement/courseManagement/index.vue
  6. 2 2
      src/views/safetyEducationExaminationNew/courseManagement/courseManagement/studyCourses.vue
  7. 3 3
      src/views/safetyEducationExaminationNew/courseManagement/coursewareManagement/addPage.vue
  8. 1 1
      src/views/safetyEducationExaminationNew/courseManagement/coursewareManagement/index.vue
  9. 2 2
      src/views/safetyEducationExaminationNew/examManagement/examinationArrange/addPage.vue
  10. 2 2
      src/views/safetyEducationExaminationNew/examManagement/examinationArrange/index.vue
  11. 1 1
      src/views/safetyEducationExaminationNew/examManagement/examinationArrange/studentsTakingMakeUpExams.vue
  12. 1 1
      src/views/safetyEducationExaminationNew/examManagement/examinationResult/viewGrades.vue
  13. 1 1
      src/views/safetyEducationExaminationNew/examManagement/testPaperManagement/addPage.vue
  14. 2 2
      src/views/safetyEducationExaminationNew/examManagement/testPaperManagement/index.vue
  15. 2 2
      src/views/safetyEducationExaminationNew/featurePage/learningCourse/index.vue
  16. 1 1
      src/views/safetyEducationExaminationNew/featurePage/learningMaterials/index.vue
  17. 13 2
      src/views/safetyEducationExaminationNew/featurePage/mockExam/index.vue
  18. 1 1
      src/views/safetyEducationExaminationNew/featurePage/startPracticing/index.vue
  19. 19 8
      src/views/safetyEducationExaminationNew/featurePage/startTheExam/index.vue
  20. 2 2
      src/views/safetyEducationExaminationNew/mockPractice/mockPractice.vue
  21. 2 2
      src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/classHoursConfiguration.vue
  22. 2 2
      src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/examinationConfiguration.vue
  23. 2 2
      src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/gradingConfiguration.vue
  24. 2 2
      src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/otherConfiguration.vue
  25. 2 2
      src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/specialtyConfiguration.vue
  26. 2 2
      src/views/safetyEducationExaminationNew/publicConfiguration/certificateTemplate/index.vue
  27. 1 1
      src/views/safetyEducationExaminationNew/publicConfiguration/knowledgePointManagement/index.vue
  28. 4 4
      src/views/safetyEducationExaminationNew/questionBankManagement/questionBankManagement/addPage.vue
  29. 1 1
      src/views/safetyEducationExaminationNew/questionBankManagement/questionBankManagement/index.vue
  30. 74 13
      src/views/safetyEducationExaminationNew/safetyEducation/knowledgeLearning/index.vue
  31. 1 1
      src/views/safetyEducationExaminationNew/safetyEducation/learningTasks/index.vue
  32. 12 14
      src/views/safetyEducationExaminationNew/safetyTest/myGrades/dataStatisticsReport.vue
  33. 11 3
      src/views/safetyEducationExaminationNew/safetyTest/myGrades/index.vue
  34. 2 2
      src/views/safetyEducationExaminationNew/startExam/startExam.vue
  35. 1 1
      src/views/safetyEducationExaminationNew/workbench/LabBindingApply.vue
  36. 1 1
      src/views/safetyEducationExaminationNew/workbench/ResourceCard.vue
  37. 80 38
      src/views/safetyEducationExaminationNew/workbench/TaskCard.vue
  38. 2 2
      src/views/safetyEducationExaminationNew/workbench/UserInfoCard.vue

+ 1 - 0
package.json

@@ -56,6 +56,7 @@
     "flv.js": "^1.6.2",
     "fuse.js": "6.4.3",
     "highlight.js": "9.18.5",
+    "hls.js": "^1.6.17",
     "html2canvas": "^1.4.1",
     "install": "^0.13.0",
     "js-base64": "^3.7.2",

+ 2 - 2
src/assets/styles/button.scss

@@ -307,9 +307,9 @@
   line-height:40px;
   font-size:14px;
   border-radius: 6px;
-  border: 1px solid $buttonColorI;
+  border: 1px solid $buttonColorC;
   color:$buttonColorA;
-  background-color:$buttonColorI;
+  background-color:$buttonColorC;
   margin:0 10px 0 0;
   overflow: hidden;
   i{

+ 141 - 84
src/views/safetyEducationExaminationNew/components/videoComponent.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="video-component">
+    <!-- 注意:移除了 :src="url",因为 src 将由 JS 动态绑定 -->
     <video
       ref="videoRef"
-      :src="url"
-      autoplay  controls muted
+      autoplay controls muted
       preload="metadata"
       class="video-player"
       @timeupdate="onTimeUpdate"
@@ -15,103 +15,160 @@
 </template>
 
 <script>
-const STORAGE_KEY_PREFIX = 'video_progress_'
+  import Hls from 'hls.js';
 
-export default {
-  name: 'VideoComponent',
-  props: {
-    userId: {
-      type: [String, Number],
-      required: true,
+  const STORAGE_KEY_PREFIX = 'video_progress_';
+
+  export default {
+    name: 'VideoComponent',
+    props: {
+      userId: {
+        type: [String, Number],
+        required: true,
+      },
+      url: {
+        type: String,
+        required: true,
+      },
     },
-    url: {
-      type: String,
-      required: true,
+    data() {
+      return {
+        _saveTimer: null,
+        hls: null, // 新增:存储 hls 实例
+      };
     },
-  },
-  data() {
-    return {
-      // 节流定时器:每5秒最多保存一次
-      _saveTimer: null,
-    }
-  },
-  computed: {
-    // 每个用户+每个视频单独一个key
-    storageKey() {
-      const safeUrl = this.url.replace(/[^a-zA-Z0-9]/g, '_').slice(-60)
-      return `${STORAGE_KEY_PREFIX}${this.userId}_${safeUrl}`
+    computed: {
+      storageKey() {
+        const safeUrl = this.url.replace(/[^a-zA-Z0-9]/g, '_').slice(-60);
+        return `${STORAGE_KEY_PREFIX}${this.userId}_${safeUrl}`;
+      },
     },
-  },
-  methods: {
-    // 读取上次保存的时间点
-    getSavedTime() {
-      try {
-        const val = localStorage.getItem(this.storageKey)
-        return val ? parseFloat(val) : 0
-      } catch {
-        return 0
-      }
+    mounted() {
+      this.initPlayer();
     },
+    methods: {
+      // 初始化播放器
+      initPlayer() {
+        const video = this.$refs.videoRef;
+        if (!video) return;
 
-    // 视频元数据加载完成后跳转到上次位置
-    onLoadedMetadata() {
-      const saved = this.getSavedTime()
-      const video = this.$refs.videoRef
-      if (saved > 0 && video && saved < video.duration - 1) {
-        video.currentTime = saved
-      }
-    },
+        // 1. 优先检测浏览器是否原生支持 HLS (如 Safari, iOS)
+        if (video.canPlayType('application/vnd.apple.mpegurl')) {
+          video.src = this.url;
+        }
+        // 2. 检测是否支持 hls.js (如 Firefox, Chrome)
+        else if (Hls.isSupported()) {
+          this.hls = new Hls();
+          this.hls.loadSource(this.url);
+          this.hls.attachMedia(video);
 
-    // timeupdate 触发频繁(约250ms一次),用节流降低保存频率到每5秒一次
-    onTimeUpdate() {
-      if (this._saveTimer) return
-      this._saveTimer = setTimeout(() => {
-        this._saveTimer = null
-        this.saveProgress()
-      }, 5000)
-    },
+          // 监听 HLS 解析完成事件
+          this.hls.on(Hls.Events.MANIFEST_PARSED, () => {
+            console.log('HLS 视频源解析完成,准备播放');
+          });
 
-    // 实际写入 localStorage
-    saveProgress() {
-      const video = this.$refs.videoRef
-      if (!video) return
-      try {
-        localStorage.setItem(this.storageKey, String(video.currentTime))
-      } catch {
-        // localStorage 不可用时静默失败
-      }
+          // 监听错误事件
+          this.hls.on(Hls.Events.ERROR, (event, data) => {
+            if (data.fatal) {
+              switch (data.type) {
+                case Hls.ErrorTypes.NETWORK_ERROR:
+                  console.error('网络错误,尝试恢复...');
+                  this.hls.startLoad();
+                  break;
+                case Hls.ErrorTypes.MEDIA_ERROR:
+                  console.error('媒体解码错误,尝试恢复...');
+                  this.hls.recoverMediaError();
+                  break;
+                default:
+                  console.error('发生不可恢复的致命错误');
+                  this.hls.destroy();
+                  break;
+              }
+            }
+          });
+        }
+        // 3. 都不支持
+        else {
+          console.error('当前浏览器不支持 HLS 视频播放');
+        }
+      },
+
+      // 读取上次保存的时间点
+      getSavedTime() {
+        try {
+          const val = localStorage.getItem(this.storageKey);
+          return val ? parseFloat(val) : 0;
+        } catch {
+          return 0;
+        }
+      },
+
+      // 视频元数据加载完成后跳转到上次位置
+      onLoadedMetadata() {
+        const saved = this.getSavedTime();
+        const video = this.$refs.videoRef;
+        if (saved > 0 && video && saved < video.duration - 1) {
+          video.currentTime = saved;
+        }
+      },
+
+      // timeupdate 节流处理
+      onTimeUpdate() {
+        if (this._saveTimer) return;
+        this._saveTimer = setTimeout(() => {
+          this._saveTimer = null;
+          this.saveProgress();
+        }, 5000);
+      },
+
+      // 实际写入 localStorage
+      saveProgress() {
+        const video = this.$refs.videoRef;
+        if (!video) return;
+        try {
+          localStorage.setItem(this.storageKey, String(video.currentTime));
+        } catch {
+          // localStorage 不可用时静默失败
+        }
+      },
+
+      // 播放结束时清除记录
+      onEnded() {
+        try {
+          localStorage.removeItem(this.storageKey);
+        } catch {
+          // ignore
+        }
+      },
     },
+    beforeDestroy() {
+      // 1. 清除保存进度的定时器
+      if (this._saveTimer) {
+        clearTimeout(this._saveTimer);
+        this._saveTimer = null;
+      }
+      // 2. 销毁前立即保存一次进度
+      this.saveProgress();
 
-    // 播放结束时清除记录,下次从头开始
-    onEnded() {
-      try {
-        localStorage.removeItem(this.storageKey)
-      } catch {
-        // ignore
+      // 3. 【关键】销毁 hls 实例,释放内存并断开网络连接
+      if (this.hls) {
+        this.hls.destroy();
+        this.hls = null;
       }
     },
-  },
-  beforeDestroy() {
-    // 组件销毁前立即保存一次,清除定时器
-    if (this._saveTimer) {
-      clearTimeout(this._saveTimer)
-      this._saveTimer = null
-    }
-    this.saveProgress()
-  },
-}
+  };
 </script>
 
 <style scoped lang="scss">
-.video-component {
-  width: 100%;
+  .video-component {
+    width: 100%;
 
-  .video-player {
-    width:1458px;
-    height:797px;
-    display: block;
-    background: #000;
-    border-radius: 6px;
+    .video-player {
+      width: 1458px;
+      height: 797px;
+      display: block;
+      background: #000;
+      border-radius: 6px;
+    }
   }
-}
 </style>

+ 2 - 2
src/views/safetyEducationExaminationNew/courseManagement/courseManagement/addPage.vue

@@ -137,7 +137,7 @@
       //重置
       resetButton(){
         let self = this;
-        this.$confirm('是否确认重置?', "警告", {
+        this.$confirm('是否确认重置?', "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
@@ -163,7 +163,7 @@
       },
       pageDataB(){
         let self = this;
-        this.$confirm('是否确认保存?', "警告", {
+        this.$confirm('是否确认保存?', "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/courseManagement/courseManagement/index.vue

@@ -245,7 +245,7 @@
           this.$set(this,'propsData',{});
         }else if(type == 2){
           //复制
-          this.$confirm('是否确认复制?', "警告", {
+          this.$confirm('是否确认复制?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"
@@ -263,7 +263,7 @@
           this.$set(this,'propsData',obj);
         }else if(type == 4){
           //删除
-          this.$confirm('是否确认删除?', "警告", {
+          this.$confirm('是否确认删除?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/courseManagement/courseManagement/studyCourses.vue

@@ -363,7 +363,7 @@
       delBigItem(index){
         let self = this;
         let text = self.dataList[index].data1;
-        this.$confirm('确认删除 '+text+' ?', "警告", {
+        this.$confirm('确认删除 '+text+' ?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -377,7 +377,7 @@
       delItem(index,minIndex){
         let self = this;
         let text = self.dataList[index].data1+' 下的 '+self.dataList[index].minList[minIndex].minData1;
-        this.$confirm('确认删除 '+text+' 课件?', "警告", {
+        this.$confirm('确认删除 '+text+' 课件?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"

+ 3 - 3
src/views/safetyEducationExaminationNew/courseManagement/coursewareManagement/addPage.vue

@@ -406,7 +406,7 @@
       //重置
       resetButton(){
         let self = this;
-        this.$confirm('确认重置数据?', "警告", {
+        this.$confirm('确认重置数据?', "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
@@ -420,7 +420,7 @@
         let self = this;
         this.$refs["form"].validate(valid => {
           if (valid) {
-            this.$confirm('是否确认保存?', "警告", {
+            this.$confirm('是否确认保存?', "提示", {
               confirmButtonText: "确定",
               cancelButtonText: "取消",
               type: "warning"
@@ -544,7 +544,7 @@
                 attachmentSize:res.data.data.size+'',
               }]);
               this.$set(this.newData,'coursewareName',this.getLeftPart(res.data.data.name));
-              this.$set(this.newData,'minLearningDuration',Math.floor(seconds / res.data.data.duration));
+              this.$set(this.newData,'minLearningDuration',Math.max(1, Math.round(res.data.data.duration / 60)));
             } else {
               this.msgError('上传出错,请稍后再试')
             }

+ 1 - 1
src/views/safetyEducationExaminationNew/courseManagement/coursewareManagement/index.vue

@@ -269,7 +269,7 @@
           this.$set(this,'propsData',obj);
         }else if(type == 4){
           //删除
-          this.$confirm('是否确认删除?', "警告", {
+          this.$confirm('是否确认删除?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/examManagement/examinationArrange/addPage.vue

@@ -947,7 +947,7 @@
             const matchedTab = tabFieldMap.find(item => item.list.includes(firstErrorField))
             this.activeTab = matchedTab ? matchedTab.tab : 'basic'
           } else {
-            this.$confirm('是否确认保存?', "警告", {
+            this.$confirm('是否确认保存?', "提示", {
               confirmButtonText: "确定",
               cancelButtonText: "取消",
               type: "warning"
@@ -983,7 +983,7 @@
             staffNewHours:0,
             staffNonNewHours:0,
           },
-          knowledgePointIds:this.newData.studyHoursRequirement == 1&&(!this.yzyhTest&&!this.placementTest)?this.newData.knowledgePointIds:[],
+          knowledgePointIds:this.newData.studyHoursRequirementEnabled == 1&&(!this.yzyhTest&&!this.placementTest)?this.newData.knowledgePointIds:[],
           preCourseEnabled:this.newData.preCourseEnabled,
           preCourseId:this.newData.preCourseEnabled == 1?this.newData.preCourseId:'',
           mockEnabled:this.newData.mockEnabled,

+ 2 - 2
src/views/safetyEducationExaminationNew/examManagement/examinationArrange/index.vue

@@ -279,7 +279,7 @@
           this.$set(this,'propsData',obj);
         }else if(type == 4){
           //复制
-          this.$confirm('是否确认复制?', "警告", {
+          this.$confirm('是否确认复制?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"
@@ -292,7 +292,7 @@
           }).catch(() => {});
         }else if(type == 5){
           //删除
-          this.$confirm('是否确认删除?', "警告", {
+          this.$confirm('是否确认删除?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"

+ 1 - 1
src/views/safetyEducationExaminationNew/examManagement/examinationArrange/studentsTakingMakeUpExams.vue

@@ -283,7 +283,7 @@
         let  self = this;
         this.$refs.form.validate((valid, fields) => {
           if (valid) {
-            this.$confirm('是否确认保存?', "警告", {
+            this.$confirm('是否确认保存?', "提示", {
               confirmButtonText: "确定",
               cancelButtonText: "取消",
               type: "warning"

+ 1 - 1
src/views/safetyEducationExaminationNew/examManagement/examinationResult/viewGrades.vue

@@ -79,7 +79,7 @@
         <el-table-column label="学院单位" prop="deptName" width="240" show-overflow-tooltip/>
         <el-table-column label="交卷时间" prop="submitTime" width="200" show-overflow-tooltip>
           <template slot-scope="scope">
-            <span>{{ parseTime(scope.row.submitTime,"{y}-{m}-{d} {h}:{i}") }}至{{ parseTime(scope.row.createTime,"{y}-{m}-{d} {h}:{i}") }}</span>
+            <span>{{ parseTime(scope.row.submitTime,"{y}-{m}-{d} {h}:{i}") }}</span>
           </template>
         </el-table-column>
         <el-table-column label="用时" prop="durationText" width="140" show-overflow-tooltip/>

+ 1 - 1
src/views/safetyEducationExaminationNew/examManagement/testPaperManagement/addPage.vue

@@ -553,7 +553,7 @@
               this.msgError('总分数与试题分数不一致')
               return
             }
-            this.$confirm('是否确认保存?', "警告", {
+            this.$confirm('是否确认保存?', "提示", {
               confirmButtonText: "确定",
               cancelButtonText: "取消",
               type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/examManagement/testPaperManagement/index.vue

@@ -242,7 +242,7 @@
           this.$set(this,'propsData',obj);
         }else if(type == 4){
           //复制
-          this.$confirm('是否确认复制?', "警告", {
+          this.$confirm('是否确认复制?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"
@@ -255,7 +255,7 @@
           }).catch(() => {});
         }else if(type == 5){
           //删除
-          this.$confirm('是否确认删除?', "警告", {
+          this.$confirm('是否确认删除?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/featurePage/learningCourse/index.vue

@@ -135,7 +135,7 @@
       //完成课件学习
       finishStudying(index){
         let self = this;
-        this.$confirm('确认完成课件学习?', "警告", {
+        this.$confirm('确认完成课件学习?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -155,7 +155,7 @@
           self.handleToggle();
           self.verificationHandleToggle();
           if(this.checkLearningIndex != index){
-            this.$confirm('确认切换课件?', "警告", {
+            this.$confirm('确认切换课件?', "提示", {
               confirmButtonText: "确认",
               cancelButtonText: "取消",
               type: "warning"

+ 1 - 1
src/views/safetyEducationExaminationNew/featurePage/learningMaterials/index.vue

@@ -119,7 +119,7 @@
       //完成课件学习
       finishStudying(index){
         let self = this;
-        this.$confirm('确认完成课件学习?', "警告", {
+        this.$confirm('确认完成课件学习?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"

+ 13 - 2
src/views/safetyEducationExaminationNew/featurePage/mockExam/index.vue

@@ -398,7 +398,7 @@
             }
           }
         }
-        self.$confirm(num==0?'确认要交卷吗?':'还有'+num+'题未答,确认要交卷吗?', "提示", {
+        self.$confirm(num==0?'确认要交卷吗?':'还有'+num+'题未答,确认要交卷吗?', "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
@@ -520,7 +520,18 @@
             this.msgError('考试时间结束,已自动交卷');
             this.msgError('考试时间结束,已自动交卷');
             this.msgError('考试时间结束,已自动交卷');
-            this.examUserExamAnswerSaveExamUserExamSubmit();
+            if(this.currentQuestion.answerTags[0]){
+              examUserExamAnswerSave({
+                attemptId: this.newData.attemptId,
+                snapshotQuestionId:this.currentQuestion.snapshotQuestionId,
+                userAnswer:this.currentQuestion.answerTags+'',
+              }).then(response => {
+                this.$set(this.questionTypeGroups[this.groupIndex].questions[this.questionIndex],'isCorrect',response.data);
+                this.examUserExamSubmit();
+              })
+            }else{
+              this.examUserExamSubmit();
+            }
           }
         })
         this.warningTimer.start()

+ 1 - 1
src/views/safetyEducationExaminationNew/featurePage/startPracticing/index.vue

@@ -370,7 +370,7 @@
             }
           }
         }
-        self.$confirm(num==0?'确认要交卷吗?':'还有'+num+'题未答,确认要交卷吗?', "提示", {
+        self.$confirm(num==0?'确认要交卷吗?':'还有'+num+'题未答,确认要交卷吗?', "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"

+ 19 - 8
src/views/safetyEducationExaminationNew/featurePage/startTheExam/index.vue

@@ -85,12 +85,12 @@
     </div>
     <div class="shade-max-big-box" v-if="shadeType">
       <div class="shade-big-box">
-        <div class="title-box" v-if="shadeData.type==1||shadeData.type==2">
+        <div class="title-box">
           <p><span>{{shadeData.totalScore}}</span>分</p>
         </div>
-        <div class="title-box" v-if="shadeData.type==3||shadeData.type==4">
-          <p>{{shadeData.type==3?'成绩有效':(shadeData.type==4?'成绩无效':'')}}</p>
-        </div>
+        <!--<div class="title-box" v-if="shadeData.type==4">-->
+          <!--<p>成绩无效</p>-->
+        <!--</div>-->
         <p class="text-p">{{shadeData.type==1||shadeData.type==2?'本次考试成绩不及格!':(shadeData.type==3?'本次考试成绩突破历史最佳记录':(shadeData.type==4?'本次考试成绩未突破历史最佳记录,故作无效处理!':''))}}</p>
         <div class="button-box">
           <p class="null-p"></p>
@@ -347,7 +347,7 @@
             }
           }
         }
-        self.$confirm(num==0?'确认要交卷吗?':'还有'+num+'题未答,确认要交卷吗?', "提示", {
+        self.$confirm(num==0?'确认要交卷吗?':'还有'+num+'题未答,确认要交卷吗?', "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
@@ -369,7 +369,7 @@
               //最佳记录
               this.$set(this,'shadeData',{
                 type:3,
-                totalScore:0,
+                totalScore:response.data.totalScore,
                 canContinueExam:0,
               });
               this.$set(this,'shadeType',true);
@@ -377,7 +377,7 @@
               //非最佳记录
               this.$set(this,'shadeData',{
                 type:4,
-                totalScore:0,
+                totalScore:response.data.totalScore,
                 canContinueExam:0,
               });
               this.$set(this,'shadeType',true);
@@ -497,7 +497,18 @@
             this.msgError('考试时间结束,已自动交卷');
             this.msgError('考试时间结束,已自动交卷');
             this.msgError('考试时间结束,已自动交卷');
-            this.examUserExamAnswerSaveExamUserExamSubmit();
+            if(this.currentQuestion.answerTags[0]){
+              examUserExamAnswerSave({
+                attemptId: this.newData.attemptId,
+                snapshotQuestionId:this.currentQuestion.snapshotQuestionId,
+                userAnswer:this.currentQuestion.answerTags+'',
+              }).then(response => {
+                this.$set(this.questionTypeGroups[this.groupIndex].questions[this.questionIndex],'answered',1);
+                this.examUserExamSubmit();
+              })
+            }else{
+              this.examUserExamSubmit();
+            }
           }
         })
         this.warningTimer.start()

+ 2 - 2
src/views/safetyEducationExaminationNew/mockPractice/mockPractice.vue

@@ -197,7 +197,7 @@
           this.$set(this, 'propsData', obj)
         } else if (type == 4) {
           //删除
-          this.$confirm('是否确认删除?', '警告', {
+          this.$confirm('是否确认删除?', '提示', {
             confirmButtonText: '确定',
             cancelButtonText: '取消',
             type: 'warning'
@@ -212,7 +212,7 @@
         } else if (type == 5) {
           //启用&停用
           let text = row.state ? '停用' : '启用'
-          this.$confirm('是否确认' + text + '?', '警告', {
+          this.$confirm('是否确认' + text + '?', '提示', {
             confirmButtonText: '确定',
             cancelButtonText: '取消',
             type: 'warning'

+ 2 - 2
src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/classHoursConfiguration.vue

@@ -187,7 +187,7 @@
       //重置
       resetButton(){
         let self = this;
-        this.$confirm('确认重置?', "警告", {
+        this.$confirm('确认重置?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -201,7 +201,7 @@
         let self = this;
         this.$refs["form"].validate(valid => {
           if (valid) {
-            this.$confirm('确认提交?', "警告", {
+            this.$confirm('确认提交?', "提示", {
               confirmButtonText: "确认",
               cancelButtonText: "取消",
               type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/examinationConfiguration.vue

@@ -96,7 +96,7 @@
       //重置
       resetButton(){
         let self = this;
-        this.$confirm('确认重置?', "警告", {
+        this.$confirm('确认重置?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -112,7 +112,7 @@
           this.msgError('请确认考试类型名称')
           return
         }
-        this.$confirm('确认提交?', "警告", {
+        this.$confirm('确认提交?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/gradingConfiguration.vue

@@ -212,7 +212,7 @@
       //重置
       resetButton(){
         let self = this;
-        this.$confirm('确认重置?', "警告", {
+        this.$confirm('确认重置?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -226,7 +226,7 @@
         let self = this;
         this.$refs["form"].validate(valid => {
           if (valid) {
-            this.$confirm('确认提交?', "警告", {
+            this.$confirm('确认提交?', "提示", {
               confirmButtonText: "确认",
               cancelButtonText: "取消",
               type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/otherConfiguration.vue

@@ -82,7 +82,7 @@
       //重置
       resetButton(){
         let self = this;
-        this.$confirm('确认重置?', "警告", {
+        this.$confirm('确认重置?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -96,7 +96,7 @@
         let self = this;
         this.$refs["form"].validate(valid => {
           if (valid) {
-            this.$confirm('确认提交?', "警告", {
+            this.$confirm('确认提交?', "提示", {
               confirmButtonText: "确认",
               cancelButtonText: "取消",
               type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/publicConfiguration/basicConfiguration/specialtyConfiguration.vue

@@ -88,7 +88,7 @@
       //重置
       resetButton(){
         let self = this;
-        this.$confirm('确认重置?', "警告", {
+        this.$confirm('确认重置?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -104,7 +104,7 @@
           this.msgError('请确认考试类型名称')
           return
         }
-        this.$confirm('确认提交?', "警告", {
+        this.$confirm('确认提交?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"

+ 2 - 2
src/views/safetyEducationExaminationNew/publicConfiguration/certificateTemplate/index.vue

@@ -212,7 +212,7 @@
           this.$set(this,'propsData',obj);
         }else if(type == 4){
           //删除
-          this.$confirm('是否确认删除?', "警告", {
+          this.$confirm('是否确认删除?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"
@@ -226,7 +226,7 @@
         }else if(type == 5){
           //启用&停用
           let text = row.state  ? "停用" : "启用";
-          this.$confirm('是否确认' + text + '?', "警告", {
+          this.$confirm('是否确认' + text + '?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"

+ 1 - 1
src/views/safetyEducationExaminationNew/publicConfiguration/knowledgePointManagement/index.vue

@@ -258,7 +258,7 @@
           this.$set(this,'dialogType',true);
         }else if(type == 5){
           //删除
-          this.$confirm('是否确认删除?', "警告", {
+          this.$confirm('是否确认删除?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"

+ 4 - 4
src/views/safetyEducationExaminationNew/questionBankManagement/questionBankManagement/addPage.vue

@@ -271,7 +271,7 @@
       },
       resetButton(){
         let self = this;
-        this.$confirm('是否确认重置?', "警告", {
+        this.$confirm('是否确认重置?', "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
@@ -318,7 +318,7 @@
                 return
               }
             }
-            this.$confirm('是否确认保存?', "警告", {
+            this.$confirm('是否确认保存?', "提示", {
               confirmButtonText: "确定",
               cancelButtonText: "取消",
               type: "warning"
@@ -391,7 +391,7 @@
           this.msgError('已达到数量上限,最多8个选项.')
           return
         }
-        this.$confirm('确认添加新选项?', "警告", {
+        this.$confirm('确认添加新选项?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -404,7 +404,7 @@
       //删除选项
       delItem(index){
         let self = this;
-        this.$confirm('确认删除 '+this.getLetter(index)+' 选项?', "警告", {
+        this.$confirm('确认删除 '+this.getLetter(index)+' 选项?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"

+ 1 - 1
src/views/safetyEducationExaminationNew/questionBankManagement/questionBankManagement/index.vue

@@ -265,7 +265,7 @@
           this.$set(this,'propsData',obj);
         }else if(type == 4){
           //删除
-          this.$confirm('是否确认删除?', "警告", {
+          this.$confirm('是否确认删除?', "提示", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"

+ 74 - 13
src/views/safetyEducationExaminationNew/safetyEducation/knowledgeLearning/index.vue

@@ -2,7 +2,8 @@
 <template>
   <div class="app-container knowledgeLearning">
     <div class="page-container knowledgeLearningPage">
-      <p class="pageTitle">知识学习</p>
+      <p class="pageTitle" v-if="!examName">知识学习</p>
+      <p class="pageTitle" v-if="examName"><span style="font-weight:700;margin-right:40px;">{{examName}}学时任务</span><span style="font-size:14px;color:#0183fa;">当前学时完成进度  {{completedStudyHours}} / {{studyHoursRequirement}} 学时</span></p>
       <div class="max-big-box">
         <div class="left-box scrollbar-box">
           <p @click="leftCheckButton(index)"
@@ -12,13 +13,15 @@
           </p>
         </div>
         <div class="right-box">
-          <div class="top-max-button-box">
-            <p :class="topButtonIndex == 1?'top-check-button':''" @click="topCheckButton(1)">视频资源</p>
-            <p :class="topButtonIndex == 2?'top-check-button':''" @click="topCheckButton(2)">文档文章</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-2">
+                <div>
+                  <p :class="topButtonIndex === 1?'check-table-button':''" @click="topCheckButton(1)">视频资源</p>
+                  <p :class="topButtonIndex === 2?'check-table-button':''" @click="topCheckButton(2)">文档文章</p>
+                </div>
+              </div>
               <div class="table-top-button-box">
                 <div>
                   <p :class="learnStatus === ''?'check-table-button':''" @click="tableTypeButton('')">全部</p>
@@ -27,7 +30,7 @@
                   <p :class="learnStatus === 2?'check-table-button':''" @click="tableTypeButton(2)">已学完</p>
                 </div>
               </div>
-              <el-form-item label="" prop="knowledgePointId">
+              <el-form-item label="" prop="knowledgePointId" v-if="!this.knowledgePointIds[0]">
                 <el-cascader
                   v-model="queryParams.knowledgePointId"
                   :options="optionListB"
@@ -83,6 +86,7 @@
   </div>
 </template>
 <script>
+  import { Encrypt,Decrypt} from '@/utils/secret'
   //import { getDicts } from "@/api/commonality/noPermission";
   //import { systemUserSelect } from "@/api/commonality/permission";
   //import { getInfo } from "@/api/basicsModules/index";
@@ -114,6 +118,11 @@
         dataList: [],
         //数据数量
         total: 0,
+        //跳转逻辑数据
+        examName:'',
+        knowledgePointIds:[],
+        completedStudyHours:0,
+        studyHoursRequirement:0,
       }
     },
     created() {
@@ -123,6 +132,18 @@
       if(this.$route.params.skip){
         this.$set(this,'topButtonIndex',2);
       }
+      if(this.$route.query.text){
+        let obj = JSON.parse(Decrypt(this.$route.query.text));
+        this.$set(this,'examName',obj.examName);
+        this.$set(this,'knowledgePointIds',obj.knowledgePointIds);
+        this.$set(this,'completedStudyHours',obj.completedStudyHours);
+        this.$set(this,'studyHoursRequirement',obj.studyHoursRequirement);
+      }
+
+      // this.$set(this,'examName',this.$route.query.examName?this.$route.query.examName:'');
+      // this.$set(this,'knowledgePointIds',this.$route.query.knowledgePointIds?this.$route.query.knowledgePointIds:[]);
+      // this.$set(this,'completedStudyHours',this.$route.query.completedStudyHours?this.$route.query.completedStudyHours:0);
+      // this.$set(this,'studyHoursRequirement',this.$route.query.studyHoursRequirement?this.$route.query.studyHoursRequirement:0);
       this.examElKnowledgePointTreeList();
     },
     methods: {
@@ -183,7 +204,7 @@
       tableButton(item) {
         let self = this;
         if(item.learnStatus == 2){
-          this.$confirm('该课件已学完,是否重置进度重新学习?', "警告", {
+          this.$confirm('该课件已学完,是否重置进度重新学习?', "提示", {
             confirmButtonText: "确认",
             cancelButtonText: "取消",
             type: "warning"
@@ -208,11 +229,18 @@
         }
       },
       examElKnowledgePointTreeList(){
-        examElKnowledgePointTreeList({}).then(response => {
+        let obj = {
+          knowledgePointIds : this.knowledgePointIds
+        };
+        examElKnowledgePointTreeList(obj).then(response => {
           const list = response.data || [];
           this.formatTreeData(list);
-          this.$set(this, 'letDataList', list);
-          this.$set(this, 'optionListB', list[0].children?list[0].children:[]);
+          if(this.knowledgePointIds[0]){
+            this.$set(this, 'letDataList', list);
+            this.$set(this, 'optionListB', list[0].children?list[0].children:[]);
+          }else{
+            this.$set(this, 'letDataList', [{knowledgePointName:'全部',id:''},...list]);
+          }
           this.getList();
         });
       },
@@ -247,7 +275,7 @@
             margin:5px 0;
             padding:0 20px;
             text-align: center;
-            border-right:4px solid #ffffff;
+            /*border-right:4px solid #ffffff;*/
             cursor: pointer;
             font-weight:700;
             font-size:16px;
@@ -263,8 +291,9 @@
             color: #ffffff;
           }
           .leftCheck{
-            color: #0183fa;
-            border-right:4px solid #0183fa;
+            color: #fff;
+            background-color: #0183fa;
+            /*border-right:4px solid #0183fa;*/
           }
         }
         .right-box{
@@ -291,6 +320,38 @@
               color:#fff;
             }
           }
+          .table-top-button-box-2{
+            display: inline-block;
+            vertical-align: top;
+            margin-right:10px;
+            div{
+              display: flex;
+              p{
+                border:1px solid #DCDFE6;
+                width:100px;
+                text-align: center;
+                height:40px;
+                line-height:40px;
+                cursor: pointer;
+                font-size:14px;
+              }
+              p:nth-child(1){
+                border-top-left-radius:4px;
+                border-bottom-left-radius:4px;
+                border-right:none;
+              }
+              p:nth-child(2){
+                border-left:none;
+                border-top-right-radius:4px;
+                border-bottom-right-radius:4px;
+              }
+              .check-table-button{
+                border:1px solid #0183fa;
+                background-color: #0183fa;
+                color:#fff;
+              }
+            }
+          }
           .table-top-button-box{
             display: inline-block;
             vertical-align: top;

+ 1 - 1
src/views/safetyEducationExaminationNew/safetyEducation/learningTasks/index.vue

@@ -145,7 +145,7 @@
       tableButton(item) {
         let self = this;
         if(item.conditionType == 1){
-          this.$confirm('还未达到学时要求,是否现在去学习?', "警告", {
+          this.$confirm('还未达到学时要求,是否现在去学习?', "提示", {
             confirmButtonText: "确认",
             cancelButtonText: "取消",
             type: "warning"

+ 12 - 14
src/views/safetyEducationExaminationNew/safetyTest/myGrades/dataStatisticsReport.vue

@@ -48,7 +48,7 @@
             </div>
           </div>
           <!--学年学时-->
-          <div class="study-hours-max-big-box">
+          <div class="study-hours-max-big-box" v-if="newData.studyHoursList[0]">
             <div class="study-hours-title-box">
               <p></p>
               <p>学年学时完成情况</p>
@@ -58,18 +58,18 @@
               <p>完成学时</p>
               <p>要求学时</p>
             </div>
-            <div class="study-hours-for-box" v-for="(item,index) in newData.yearList" :key="index">
+            <div class="study-hours-for-box" v-for="(item,index) in newData.studyHoursList" :key="index">
               <p>{{item.academicYear}}</p>
               <p>{{item.completedStudyHours}}</p>
               <p>{{item.studyHoursRequirement}}</p>
             </div>
             <div class="study-hours-bottom-box">
               <p>累计</p>
-              <p>{{newData.total}} 学时</p>
+              <p>{{newData.totalStudyHours}} 学时</p>
             </div>
           </div>
           <!--考试通过记录-->
-          <div class="study-hours-max-big-box-2">
+          <div class="study-hours-max-big-box-2" v-if="newData.examPassRecords[0]">
             <div class="study-hours-title-box">
               <p></p>
               <p>考试通过记录</p>
@@ -79,14 +79,14 @@
               <p>考试类型</p>
               <p>成绩</p>
             </div>
-            <div class="study-hours-for-box" v-for="(item,index) in newData.examList" :key="index">
+            <div class="study-hours-for-box" v-for="(item,index) in newData.examPassRecords" :key="index">
               <p>{{item.academicYear}}</p>
               <p>{{item.examTypeName}}</p>
               <p>{{item.score}}</p>
             </div>
           </div>
           <!--描述信息-->
-          <p class="study-text-p">该同学在校期间认真完成实验室安全教育各项学习任务,累计完成 <span>{{newData.total}}</span> 学时安全培训,通过全部年度安全考核,具备良好的实验室安全意识和规范操作能力,特此证明。</p>
+          <p class="study-text-p">该同学在校期间认真完成实验室安全教育各项学习任务,累计完成 <span>{{newData.totalStudyHours}}</span> 学时安全培训,通过全部年度安全考核,具备良好的实验室安全意识和规范操作能力,特此证明。</p>
           <!--落款-->
           <div class="signature-box">
             <p>{{newData.issuingUnit}}</p>
@@ -108,7 +108,7 @@
   export default {
     name: 'dataStatisticsReport',
     props: {
-      propsData: {}
+      dataStatisticsReportPropsData: {}
     },
     data() {
       return {
@@ -119,9 +119,9 @@
           deptName:'',
           grade:'',
           userTypeName:'',
-          total:'',
-          yearList:[],
-          examList:[],
+          totalStudyHours:'',
+          studyHoursList:[],
+          examPassRecords:[],
           issuingUnit:'',
           issuingTime:'',
         },
@@ -135,10 +135,8 @@
     },
     methods: {
       initialize() {
-        examElLabEduRelationGraduationReport({}).then(response => {
-          this.$set(this, 'newData', response.data);
-          this.$set(this, 'showType', true);
-        });
+        this.$set(this, 'newData', this.dataStatisticsReportPropsData);
+        this.$set(this, 'showType', true);
       },
       async downloadPdf() {
         if (this.downloading) return

+ 11 - 3
src/views/safetyEducationExaminationNew/safetyTest/myGrades/index.vue

@@ -84,7 +84,7 @@
                width="778px"
                append-to-body>
       <div style="height:600px;display: flex;flex-direction: column;overflow: hidden">
-        <dataStatisticsReport ref="dataStatisticsReport"></dataStatisticsReport>
+        <dataStatisticsReport ref="dataStatisticsReport" :dataStatisticsReportPropsData="dataStatisticsReportPropsData"></dataStatisticsReport>
       </div>
       <div slot="footer" class="dialog-footer dialog-footer-box">
         <p class="dialog-footer-button-null"></p>
@@ -102,7 +102,7 @@
   import dataStatisticsReport from "./dataStatisticsReport.vue";
   import historyOfIncorrectQuestions from "@/views/safetyEducationExaminationNew/components/historyOfIncorrectQuestions.vue";
   import examRecords from "@/views/safetyEducationExaminationNew/components/examRecords.vue";
-  import { examElExamUserResultMyScoreListPage,examUserExamTypeSelectExamType, } from "@/api/safetyEducationExaminationNew/index";
+  import { examElExamUserResultMyScoreListPage,examUserExamTypeSelectExamType,examElLabEduRelationGraduationReport, } from "@/api/safetyEducationExaminationNew/index";
   export default {
     name: 'index',
     components: {
@@ -135,6 +135,7 @@
         propsData: {},
         historyOfIncorrectQuestionsPropsData:{},
         dialogType:false,
+        dataStatisticsReportPropsData:{},
       }
     },
     created() {
@@ -206,7 +207,14 @@
           this.$set(this, 'historyOfIncorrectQuestionsPropsData', obj)
         }else if(type == 3){
           //成绩报告打印
-          this.$set(this,'dialogType',true);
+          examElLabEduRelationGraduationReport({}).then(response => {
+            if(response.data.studyHoursList[0]&&response.data.examPassRecords[0]){
+              this.$set(this, 'dataStatisticsReportPropsData', response.data);
+              this.$set(this,'dialogType',true);
+            }else{
+              this.msgError('请完成至少一次课程学习与考试')
+            }
+          });
         } else if (type == 6) {
           //返回并刷新
           this.$set(this, 'pageType', 1)

+ 2 - 2
src/views/safetyEducationExaminationNew/startExam/startExam.vue

@@ -197,7 +197,7 @@
           this.$set(this, 'propsData', obj)
         } else if (type == 4) {
           //删除
-          this.$confirm('是否确认删除?', '警告', {
+          this.$confirm('是否确认删除?', '提示', {
             confirmButtonText: '确定',
             cancelButtonText: '取消',
             type: 'warning'
@@ -212,7 +212,7 @@
         } else if (type == 5) {
           //启用&停用
           let text = row.state ? '停用' : '启用'
-          this.$confirm('是否确认' + text + '?', '警告', {
+          this.$confirm('是否确认' + text + '?', '提示', {
             confirmButtonText: '确定',
             cancelButtonText: '取消',
             type: 'warning'

+ 1 - 1
src/views/safetyEducationExaminationNew/workbench/LabBindingApply.vue

@@ -150,7 +150,7 @@ export default {
       this.$set(this.dialogData,'reason','');
       if (val == 1){
         //通过
-        this.$confirm('确认审核通过?', "警告", {
+        this.$confirm('确认审核通过?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"

+ 1 - 1
src/views/safetyEducationExaminationNew/workbench/ResourceCard.vue

@@ -106,7 +106,7 @@ export default {
       }else if(type == 2){
         let self = this;
         if(item.learnStatus == 2){
-          this.$confirm('该课件已学完,是否重置进度重新学习?', "警告", {
+          this.$confirm('该课件已学完,是否重置进度重新学习?', "提示", {
             confirmButtonText: "确认",
             cancelButtonText: "取消",
             type: "warning"

+ 80 - 38
src/views/safetyEducationExaminationNew/workbench/TaskCard.vue

@@ -19,41 +19,50 @@
           </div>
         </div>
       </div>
-      <div class="study-card-box for-max-big-box">
-        <div class="year-card-top-title-box">
-          <p>学习任务</p>
-          <p>待完成的学习任务</p>
-        </div>
-        <div class="bottom-content-box scrollbar-box">
-          <p class="null-p" v-if="!studyMinList[0]">暂无数据</p>
-          <div class="bottom-big-box-2" v-for="(item,index) in studyMinList" @click="studyTableButton(item)">
-            <p>{{item.courseName}}</p>
-            <p >{{item.deptName}}丨{{item.learnStatus==0?'待完成':(item.learnStatus==1?'进行中':(item.learnStatus==2?'已完成':''))}}</p>
-          </div>
-        </div>
-      </div>
-      <div class="examination-card-box for-max-big-box">
-        <div class="year-card-top-title-box">
-          <p>模拟考试</p>
-          <p>待完成的考前模拟练习</p>
-        </div>
-        <div class="bottom-content-box scrollbar-box">
-          <p class="null-p" v-if="!examinationMinList[0]">暂无数据</p>
-          <div class="bottom-big-box-3" v-for="(item,index) in examinationMinList" @click="mockTableButton(item)">
-            <p>{{item.examName}}</p>
-            <p >最高成绩 {{item.maxScore?item.maxScore:0}}</p>
-          </div>
-        </div>
-      </div>
+      <!--学习任务卡-->
+      <!--<div class="study-card-box for-max-big-box">-->
+        <!--<div class="year-card-top-title-box">-->
+          <!--<p>学习任务</p>-->
+          <!--<p>待完成的学习任务</p>-->
+        <!--</div>-->
+        <!--<div class="bottom-content-box scrollbar-box">-->
+          <!--<p class="null-p" v-if="!studyMinList[0]">暂无数据</p>-->
+          <!--<div class="bottom-big-box-2" v-for="(item,index) in studyMinList" @click="studyTableButton(item)">-->
+            <!--<p>{{item.courseName}}</p>-->
+            <!--<p >{{item.deptName}}丨{{item.learnStatus==0?'待完成':(item.learnStatus==1?'进行中':(item.learnStatus==2?'已完成':''))}}</p>-->
+          <!--</div>-->
+        <!--</div>-->
+      <!--</div>-->
+      <!--模拟任务卡-->
+      <!--<div class="examination-card-box for-max-big-box">-->
+        <!--<div class="year-card-top-title-box">-->
+          <!--<p>模拟考试</p>-->
+          <!--<p>待完成的考前模拟练习</p>-->
+        <!--</div>-->
+        <!--<div class="bottom-content-box scrollbar-box">-->
+          <!--<p class="null-p" v-if="!examinationMinList[0]">暂无数据</p>-->
+          <!--<div class="bottom-big-box-3" v-for="(item,index) in examinationMinList" @click="mockTableButton(item)">-->
+            <!--<p>{{item.examName}}</p>-->
+            <!--<p >最高成绩 {{item.maxScore?item.maxScore:0}}</p>-->
+          <!--</div>-->
+        <!--</div>-->
+      <!--</div>-->
+      <!--在线任务卡-->
       <div class="for-max-big-box" v-for="(item,index) in dataList" :key="index">
         <div class="year-card-top-title-box">
           <p>{{item.examTypeName}}</p>
-          <p>满足前置条件后可参加考试</p>
+          <p v-if="item.examKind==1&&item.conditionType != 4">满足前置条件后可参加考试</p>
+          <p v-if="item.examKind==1&&item.conditionType == 4">
+            <span :class="!item.isPassed&&item.maxScore==0?'color-A':(!item.isPassed&&item.maxScore>0?'color-B':(item.isPassed?'color-C':''))">{{!item.isPassed&&item.maxScore==0?'未开始':(!item.isPassed&&item.maxScore>0?'未通过':(item.isPassed?'已通过':''))}}</span>
+            <span style="margin-left:20px;">{{item.maxScore>0?'成绩:'+item.maxScore+'分':''}}</span>
+          </p>
         </div>
         <div class="bottom-content-box scrollbar-box">
-          <div class="bottom-big-box-4" v-if="item.needStudy">
-            <p>学时要求</p>
-            <p class="colorA" @click="tableButton(1,item)">开始学习</p>
+          <div class="bottom-big-box-4">
+            <p :class="item.completedStudyHours<item.studyHoursRequirement?'text-name':''">学时要求</p>
+            <p class="colorA" v-if="item.needStudy" @click="tableButton(1,item)">开始学习</p>
+            <p class="position-p-1" v-if="item.completedStudyHours<item.studyHoursRequirement">{{item.completedStudyHours}} / {{item.studyHoursRequirement}}</p>
+            <p class="text-type" v-if="item.completedStudyHours>=item.studyHoursRequirement">已达标</p>
           </div>
           <div class="bottom-big-box-4" v-if="item.examStudy">
             <p>考前学习</p>
@@ -82,6 +91,7 @@
 </template>
 
 <script>
+  import { Encrypt,Decrypt} from '@/utils/secret'
   import {
     examUserCoursewareLearningRestart,examElLabEduRelationAcademicYearProgress,
     examUserCourseLearningList,examUserExamMockList,examUserExamList,examUserExamStart,
@@ -107,15 +117,15 @@ export default {
   methods: {
     initialization(){
       this.examElLabEduRelationAcademicYearProgress();
-      this.examUserCourseLearningList();
-      this.examUserExamMockList();
+      // this.examUserCourseLearningList();
+      // this.examUserExamMockList();
       this.examUserExamList();
     },
     //学习任务
     studyTableButton(item){
       let self = this;
       if(item.conditionType == 1){
-        this.$confirm('还未达到学时要求,是否现在去学习?', "警告", {
+        this.$confirm('还未达到学时要求,是否现在去学习?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -142,7 +152,7 @@ export default {
     mockTableButton(item){
       let self = this;
       if(item.conditionType == 1){
-        this.$confirm('完成学时要求后解锁,是否现在去学习?', "警告", {
+        this.$confirm('完成学时要求后解锁,是否现在去学习?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -155,7 +165,7 @@ export default {
           })
         }).catch(() => {});
       }else if(item.conditionType == 2){
-        this.$confirm('完成考前课程学习后解锁,是否现在去学习?', "警告", {
+        this.$confirm('完成考前课程学习后解锁,是否现在去学习?', "提示", {
           confirmButtonText: "确认",
           cancelButtonText: "取消",
           type: "warning"
@@ -202,9 +212,18 @@ export default {
       let self = this;
       if(type == 1){
         //学时要求
+        let obj = {
+          examName:item.examName,
+          knowledgePointIds:item.knowledgePointIds,
+          completedStudyHours:item.completedStudyHours,
+          studyHoursRequirement:item.studyHoursRequirement,
+        }
+        let text = Encrypt(JSON.stringify(obj))
         self.$router.push({
-          name: 'knowledgeLearning',
-          params: {}
+          path: '/safetyEducationExaminationNew/safetyEducation/knowledgeLearning',
+          query: {
+            text : text
+          }
         })
       }else if(type == 2){
         //学习课程
@@ -370,7 +389,7 @@ export default {
         p:nth-child(2){
           font-size:14px;
           line-height:20px;
-          margin-top:4px;
+          margin-top:6px;
 
         }
         p:nth-child(3){
@@ -385,6 +404,15 @@ export default {
           right:10px;
           padding:0 10px;
         }
+        .color-A{
+          color:#999;
+        }
+        .color-B{
+          color:#f56c6c;
+        }
+        .color-C{
+          color:#4fbe7e;
+        }
       }
       .bottom-content-box{
         height:168px;
@@ -456,6 +484,7 @@ export default {
           margin-bottom:12px;
           height:68px;
           display: flex;
+          position: relative;
           p{
             font-size:14px;
             line-height:44px;
@@ -477,6 +506,19 @@ export default {
           .colorC{
             color:#999;
           }
+          .position-p-1{
+            position: absolute;
+            bottom:0;
+            left:10px;
+            width: 60px;
+            text-align: center!important;
+          }
+          .text-name{
+            margin-top:-10px;
+          }
+          .text-type{
+            color: #4fbe7e;
+          }
         }
       }
     }

+ 2 - 2
src/views/safetyEducationExaminationNew/workbench/UserInfoCard.vue

@@ -37,7 +37,7 @@
       <div class="center-max-box">
         <div class="center-title-box scrollbar-x-box">
           <p>{{userInfo.gradeRange}}</p>
-          <p :style="'color:'+userInfo.levelColor+';'" v-if="userInfo.labName">{{userInfo.levelName}} {{userInfo.labName}}</p>
+          <p :style="'color:'+userInfo.levelColor+';'" v-if="userInfo.levelName">{{userInfo.levelName}}</p>
           <p v-if="userInfo.typeName">{{userInfo.typeName}}</p>
         </div>
         <div class="center-data-box">
@@ -316,7 +316,7 @@ export default {
         //提交
         this.$refs["shadeForm"].validate(valid => {
           if (valid) {
-            this.$confirm('确认提交?', "警告", {
+            this.$confirm('确认提交?', "提示", {
               confirmButtonText: "确认",
               cancelButtonText: "取消",
               type: "warning"