Browse Source

修改学生作答图片预览逻辑

lm 1 month ago
parent
commit
7a3ce630f7

+ 1 - 1
src/views/targetImprove/components/ImageJumpPreview.vue

@@ -88,7 +88,7 @@ export default {
                 if (newVal && newVal.name) {
                     let suffixName = newVal.name.split('.').pop();
                     if (suffixName) {
-                        this.previewType = suffixName;
+                        this.previewType = suffixName.split('?')[0];
                     }
                 }
             },

+ 46 - 30
src/views/targetImprove/components/StudentAnswerDetail.vue

@@ -2,29 +2,33 @@
     <div class="stu_answer_detail">
         <div class="title">【作 答】</div>
         <div class="desc">
-            <el-radio-group 
-                v-if="answerType == 'online'"
-            >
+            <!-- 选项形式 -->
+            <el-radio-group  v-if="answerType == 'choice'">
               <el-radio 
                 v-for="radioItem in optionList" 
                     :key="radioItem" 
                     :label="radioItem"
                     :class="{ 
-                         'is-correct-radio is-checked':  answerStr.split('').includes(radioItem), 
-                        'is-wrong-radio is-checked': studentAnswer.split('').includes(radioItem) && !(answerStr.split('').includes(radioItem))
+                         'is_correct_radio is_checked':  answerStr.split('').includes(radioItem), 
+                        'is_wrong_radio is_checked': studentAnswerInfo.studentAnswer.split('').includes(radioItem) && !(answerStr.split('').includes(radioItem))
                     }"
                 >{{ radioItem }}</el-radio>
             </el-radio-group>
 
+            <!-- 图片形式 -->
             <ImageJumpPreview 
                 v-if="answerType == 'img' && answerImg?.length > 0"
-                :fileMessage="answerImg[currentNavPage - 1]" height="400px"
-                :filePadding="{padding:`0 ${imgPreviewPadding}`}"
-                :navBarWidth="{width:`calc(100% - ${imgPreviewPadding} + 20px)`}"
-                :navBarLeft="{left: `calc(${imgPreviewPadding} / 2 - 10px)`}"
+                :fileMessage="answerImg[currentNavPage - 1]" 
+                height="400px"
+                :imgPreviewPadding="imgPreviewPadding"
                 :navTotalPage="answerImg.length"
                 :currentNavPage.sync="currentNavPage"
             ></ImageJumpPreview>
+
+            <!-- 判断题形式 √ ×-->
+            <span v-if="answerType == 'judge'" style="font-size: 14px;color: #666;">
+                {{  studentAnswerInfo.studentAnswer== '×' ? '错' : (studentAnswerInfo.studentAnswer== '√' ? '对' : '') }}
+            </span>
         </div>
     </div>
 </template>   
@@ -33,6 +37,15 @@
 <script>
 import ImageJumpPreview from './ImageJumpPreview.vue'
 import {numToCapitalLetter} from '../utils/numberToExcelCapitalLetter.js'
+/*
+interface StudentAnswerInfo {
+    isObjective:Number, //  是否是客观题(1是 0否)
+    isJudge:Number,  // 是否是判断题 (1是 0否)
+    studentAnswer:String,   //学生的答案
+    optionsNum:Number,  //  选项数量(只有 answerType 为 choice 的时候才会用到)
+    answer:String    //正确答案
+}
+*/
 
 export default ({
     name:'StudentAnswerDetail',
@@ -40,20 +53,10 @@ export default ({
         ImageJumpPreview,
     },
     props:{
-        answerType:{     //答题方式  //【线上答题(勾选选项)】online 和 【上传图片的方式】 img   
-            type:String
-        },
-
-        /** 【勾选选项】 online 用到的参数 */
-        answerOptionNum:{   // 选项数量(只有 props.answerType 为 online 的时候才会用到)
-            type:Number   
-        },
-        studentAnswer:{   //学生的答案
-            type:String,
-        },
-        rightAnswer:{  //正确答案
-            type:String,
-        },
+        studentAnswerInfo:{
+            type:Object,
+            required:true
+        },  
         /** 【拍照/传图】 img   用到的参数 */
         answerImg:{
             type:Array,  // {name:'',url:''}[]
@@ -68,11 +71,24 @@ export default ({
         }
     },
     computed:{
+        answerType(){
+            //答题方式  //【线上答题(勾选选项)】choice 、 【上传图片的方式】 img   、判断题 文本 对/错
+            if(this.studentAnswerInfo.isObjective === 1){
+                if(this.studentAnswerInfo.isJudge === 1){
+                    return 'judge'
+                }else{
+                    return 'choice'
+                }
+            }else{
+                return 'img'
+            }
+        },
+
         // 答案的选项列表
         optionList(){
             // 选项数量转换成大写字母列表
             let options = []
-            for(let i=0;i<this.answerOptionNum;i++){
+            for(let i=0;i<this.studentAnswerInfo.optionsNum;i++){
                 options[i]  = numToCapitalLetter(i)
             }
             return options
@@ -80,8 +96,8 @@ export default ({
 
         // 过滤掉HTML标签,只保留 A-G 大写字母后的正确答案
         answerStr(){
-            let ans = this.rightAnswer || '';
-            console.log("打印正确答案",this.rightAnswer);
+            let ans = this.studentAnswerInfo.answer || '';
+            console.log("打印正确答案",this.studentAnswerInfo.answer);
     
             // 1. 移除全部HTML标签
             ans = ans.replace(/<[^>]*>/g, '');
@@ -122,14 +138,14 @@ export default ({
 
     
     // 2. 错误选项样式(红色)
-    ::v-deep .is-wrong-radio {
+    ::v-deep .is_wrong_radio {
             position: relative !important;
         // 圆圈边框
         .el-radio__inner {
             border-color: #F56C6C !important;
         }
         // 选中状态(圆点填充)
-        &.is-checked .el-radio__inner {
+        &.is_checked .el-radio__inner {
             position: relative !important;
             background-color: none;
             &::after{
@@ -148,14 +164,14 @@ export default ({
     }
 
     // 正确选项样式 蓝色
-    ::v-deep .is-correct-radio {
+    ::v-deep .is_correct_radio {
             position: relative !important;
         // 圆圈边框
         .el-radio__inner {
             border-color: #2E64FA !important;
         }
         // 选中状态(圆点填充)
-        &.is-checked .el-radio__inner {
+        &.is_checked .el-radio__inner {
             position: relative !important;
             background-color: none;
 

+ 3 - 6
src/views/targetImprove/consolidate/index.vue

@@ -115,12 +115,9 @@
             <div class="item_answer"  v-if="item?.operationType == 'stuAnswerDetail'">
               <!-- 学生作答区域 -->
               <StudentAnswerDetail v-if="item?.operationType == 'stuAnswerDetail'" 
-                        :studentAnswer="item.studentAnswer" 
-                        :answerType="item.isObjective ? (item.isJudge ? 'img' : 'online') : 'img'"
-                        :answerOptionNum="item.optionsNum"
-                        :rightAnswer="item.answer"
-                        :answerImg="(item.studentAnswer?.split(',')?.map(img=>({name:img,url:img})) || [])"
-                />
+                  :studentAnswerInfo="item"
+                  :answerImg="(item.studentAnswer?.split(/,(?=http)/)?.map(img=>({name:img,url:img})) || [])"
+              />
             </div>
           </div>
           <div class="question_no_data" v-if="questionList.length==0">

+ 2 - 2
src/views/targetImprove/practice/practiceResults/practiceDetail.vue

@@ -86,7 +86,7 @@
                     <!-- 作答详情区域 -->
                     <StudentAnswerDetail v-if="item?.operationType == 'stuAnswerDetail'" 
                         :studentAnswerInfo="item"
-                        :answerImg="(item.studentAnswer?.split(',')?.map(img=>({name:img,url:img})) || [])"
+                        :answerImg="(item.studentAnswer?.split(/,(?=http)/)?.map(img=>({name:img,url:img})) || [])"
                     />
                 </li>
             </ul>
@@ -109,7 +109,7 @@ import deteaiIconLight from '@/assets/practiceResult/todo_list_light.svg'
 
 
 import AnswerAnalysis from './answerAnalysis.vue'
-import StudentAnswerDetail from './studentAnswerDetail.vue';
+import StudentAnswerDetail from '@/views/targetImprove/components/StudentAnswerDetail.vue'//学生作答组件
 
 export default ({
     name:'PracticeDetail',

+ 0 - 193
src/views/targetImprove/practice/practiceResults/studentAnswerDetail.vue

@@ -1,193 +0,0 @@
-<template>
-    <div class="stu_answer_detail">
-        <div class="title">【作 答】</div>
-        <div class="desc">
-            <!-- 选项形式 -->
-            <el-radio-group  v-if="answerType == 'choice'">
-              <el-radio 
-                v-for="radioItem in optionList" 
-                    :key="radioItem" 
-                    :label="radioItem"
-                    :class="{ 
-                         'is_correct_radio is_checked':  answerStr.split('').includes(radioItem), 
-                        'is_wrong_radio is_checked': studentAnswerInfo.studentAnswer.split('').includes(radioItem) && !(answerStr.split('').includes(radioItem))
-                    }"
-                >{{ radioItem }}</el-radio>
-            </el-radio-group>
-
-            <!-- 图片形式 -->
-            <ImageJumpPreview 
-                v-if="answerType == 'img' && answerImg?.length > 0"
-                :fileMessage="answerImg[currentNavPage - 1]" 
-                height="400px"
-                :imgPreviewPadding="imgPreviewPadding"
-                :navTotalPage="answerImg.length"
-                :currentNavPage.sync="currentNavPage"
-            ></ImageJumpPreview>
-
-            <!-- 判断题形式 √ ×-->
-            <span v-if="answerType == 'judge'" style="font-size: 14px;color: #666;">
-                {{  studentAnswerInfo.studentAnswer== '×' ? '错' : (studentAnswerInfo.studentAnswer== '√' ? '对' : '') }}
-            </span>
-        </div>
-    </div>
-</template>   
-
-
-<script>
-import ImageJumpPreview from '../../components/ImageJumpPreview.vue'
-import {numToCapitalLetter} from '../../utils/numberToExcelCapitalLetter.js'
-/*
-interface StudentAnswerInfo {
-    isObjective:Number, //  是否是客观题(1是 0否)
-    isJudge:Number,  // 是否是判断题 (1是 0否)
-    studentAnswer:String,   //学生的答案
-    optionsNum:Number,  //  选项数量(只有 answerType 为 choice 的时候才会用到)
-    answer:String    //正确答案
-}
-*/
-
-export default ({
-    name:'StudentAnswerDetail',
-    components: {
-        ImageJumpPreview,
-    },
-    props:{
-        studentAnswerInfo:{
-            type:Object,
-            required:true
-        },  
-        /** 【拍照/传图】 img   用到的参数 */
-        answerImg:{
-            type:Array,  // {name:'',url:''}[]
-        }
-    },
-    data(){
-        return {
-            imgPreviewPadding:'70px',
-            currentNavPage:1,
-  
-            
-        }
-    },
-    computed:{
-        answerType(){
-            //答题方式  //【线上答题(勾选选项)】choice 、 【上传图片的方式】 img   、判断题 文本 对/错
-            if(this.studentAnswerInfo.isObjective === 1){
-                if(this.studentAnswerInfo.isJudge === 1){
-                    return 'judge'
-                }else{
-                    return 'choice'
-                }
-            }else{
-                return 'img'
-            }
-        },
-
-        // 答案的选项列表
-        optionList(){
-            // 选项数量转换成大写字母列表
-            let options = []
-            for(let i=0;i<this.studentAnswerInfo.optionsNum;i++){
-                options[i]  = numToCapitalLetter(i)
-            }
-            return options
-        },
-
-        // 过滤掉HTML标签,只保留 A-G 大写字母后的正确答案
-        answerStr(){
-            let ans = this.studentAnswerInfo.answer || '';
-            console.log("打印正确答案",this.studentAnswerInfo.answer);
-    
-            // 1. 移除全部HTML标签
-            ans = ans.replace(/<[^>]*>/g, '');
-            // 2. 只保留 A‑G 大写英文字母,【这里必须是英文半角减号 A-G】
-            ans = ans.replace(/[^A-G]/gi, '');
-            ans = ans.toUpperCase().trim();
-            console.log("打印过滤后的正确答案",ans);
-            return ans;
-        }
-    },
-    methods: {},
-    mounted() {
-
-    },
-    
-})
-
-</script>
-
-
-<style lang="scss" scoped>
- .stu_answer_detail{
-    padding: 16px;
-    display: flex;
-    border-top: 1px solid #DCDFE6;
-    align-items: center;
-    gap:10px;
-    .title {
-        text-align: right;
-        width: 70px;
-        flex-shrink: 0;
-        font-weight: 600;
-    }
-    .desc{
-        flex: 1 1;
-        // line-height: 24px;
-    }
-
-    
-    // 2. 错误选项样式(红色)
-    ::v-deep .is_wrong_radio {
-            position: relative !important;
-        // 圆圈边框
-        .el-radio__inner {
-            border-color: #F56C6C !important;
-        }
-        // 选中状态(圆点填充)
-        &.is_checked .el-radio__inner {
-            position: relative !important;
-            background-color: none;
-            &::after{
-                    width: 8px;
-                    height: 8px;
-                    border-radius: 100%;
-                    background-color: #F56C6C !important;
-                    content: "";
-                    position: absolute;
-                    left: 50%;
-                    top: 50%;
-                    transform: translate(-50%, -50%) scale(1) !important;
-                    transition: transform 0.15s ease-in;
-            }
-        }
-    }
-
-    // 正确选项样式 蓝色
-    ::v-deep .is_correct_radio {
-            position: relative !important;
-        // 圆圈边框
-        .el-radio__inner {
-            border-color: #2E64FA !important;
-        }
-        // 选中状态(圆点填充)
-        &.is_checked .el-radio__inner {
-            position: relative !important;
-            background-color: none;
-
-            &::after{
-                    width: 8px;
-                    height: 8px;
-                    border-radius: 100%;
-                    background-color: #2E64FA!important;
-                    content: "";
-                    position: absolute;
-                    left: 50%;
-                    top: 50%;
-                    transform: translate(-50%, -50%) scale(1) !important;
-                    transition: transform 0.15s ease-in;
-            }
-        }
-    }
-}
-</style>