Просмотр исходного кода

feat(student): add submission status display and view entry for multiple question types

1. 为选择题、图片题、AI应用题、页面图像题新增答题统计和未提交查看入口
2. 修复部分样式问题,调整间距与格式化代码
3. 优化弹窗内的按钮点击事件格式
SanHQin 1 день назад
Родитель
Сommit
9fcfa16962
1 измененных файлов с 79 добавлено и 8 удалено
  1. 79 8
      src/views/Student/components/choiceQuestionDetailDialog.vue

+ 79 - 8
src/views/Student/components/choiceQuestionDetailDialog.vue

@@ -154,7 +154,7 @@
               </svg>{{ lang.ssAnalysis }}
             </div>
             <div class="ai_refresh" :class="{ 'disabled': currentAnalysis && currentAnalysis.loading }"
-              @click.stop="aiAnalysisRefresh78()" >
+              @click.stop="aiAnalysisRefresh78()">
               {{ lang.ssAIGenerate }}
               <svg viewBox="0 0 1024 1024" width="200" height="200">
                 <path
@@ -199,6 +199,14 @@
       <div class="c_t15" v-if="workDetail && workDetail.type === '15' && props.showData">
         <div class="c_t15_title">{{ workDetail.json.answerQ }}</div>
         <span class="c_t15_type">{{ lang.ssQATest }}</span>
+        <div class="c_t15_msg">
+          <div>{{ lang.ssAnswerCount }} {{ props.showData.workArray.length }}<span
+              v-if="props.showData.unsubmittedStudents.length > 0">/{{ props.showData.workArray.length +
+                props.showData.unsubmittedStudents.length
+              }}</span></div>
+          <span v-if="props.showData.unsubmittedStudents.length > 0" @click.stop="viewUnsubmittedStudents()">{{
+            lang.ssViewSubmitStatus2 }}</span>
+        </div>
         <div class="c_t15_content" v-show="!lookWorkData">
           <div class="c_t15_c_item" v-for="item in processedWorkArray" :key="item.id" @click.stop="lookWork(item.id)">
             <div class="c_t15_c_i_top">
@@ -271,6 +279,14 @@
       <div class="c_t15" v-if="workDetail && workDetail.type === '79' && props.showData">
         <div class="c_t15_title">{{ workDetail.json.answerQ }}</div>
         <span class="c_t15_type">{{ lang.ssPhoto }}</span>
+        <div class="c_t15_msg">
+          <div>{{ lang.ssAnswerCount }} {{ props.showData.workArray.length }}<span
+              v-if="props.showData.unsubmittedStudents.length > 0">/{{ props.showData.workArray.length +
+                props.showData.unsubmittedStudents.length
+              }}</span></div>
+          <span v-if="props.showData.unsubmittedStudents.length > 0" @click.stop="viewUnsubmittedStudents()">{{
+            lang.ssViewSubmitStatus2 }}</span>
+        </div>
         <div class="c_t15_content" v-show="!lookWorkData">
           <div class="c_t15_c_item" v-for="item in processedWorkArray" :key="item.id"
             @click.stop="item.content && item.content.fileList.length > 0 ? lookWork(item.id) : ''">
@@ -326,6 +342,14 @@
       <div class="c_t72" v-if="props.showData && props.showData.toolType === 72">
         <div class="c_t72_title">{{ lang.ssAiApp }}</div>
         <span class="c_t72_type">{{ lang.ssAiApp }}</span>
+                <div class="c_t72_msg">
+          <div>{{ lang.ssAnswerCount }} {{ props.showData.workArray.length }}<span
+              v-if="props.showData.unsubmittedStudents.length > 0">/{{ props.showData.workArray.length +
+                props.showData.unsubmittedStudents.length
+              }}</span></div>
+          <span v-if="props.showData.unsubmittedStudents.length > 0" @click.stop="viewUnsubmittedStudents()">{{
+            lang.ssViewSubmitStatus2 }}</span>
+        </div>
         <div class="c_t72_content" v-show="!lookWorkData">
           <div class="c_t72_c_item" v-for="item in processedWorkArray" :key="item.id" @click.stop="lookWork(item.id)">
             <div class="c_t72_c_i_top">
@@ -418,6 +442,14 @@
       <div class="c_t73" v-if="props.showData && props.showData.toolType === 73">
         <div class="c_t73_title">{{ lang.ssPageImage }}</div>
         <span class="c_t73_type">{{ lang.ssHPage }}</span>
+        <div class="c_t73_msg">
+          <div>{{ lang.ssAnswerCount }} {{ props.showData.workArray.length }}<span
+              v-if="props.showData.unsubmittedStudents.length > 0">/{{ props.showData.workArray.length +
+                props.showData.unsubmittedStudents.length
+              }}</span></div>
+          <span v-if="props.showData.unsubmittedStudents.length > 0" @click.stop="viewUnsubmittedStudents()">{{
+            lang.ssViewSubmitStatus2 }}</span>
+        </div>
         <div class="c_t73_content" v-show="!lookWorkData">
           <div class="c_t73_c_item" v-for="item in processedWorkArray" :key="item.id" @click.stop="lookWork(item.id)">
             <div class="c_t73_c_i_top">
@@ -746,7 +778,7 @@ const setEchartsArea1 = () => {
           fontSize: 17,
           lineHeight: 20,
           interval: 0,
-          formatter: function(value: any, idx: number) {
+          formatter: function (value: any, idx: number) {
             // 如果是字符串且格式为JSON(图片),则解析处理
             if (typeof value === 'string') {
               try {
@@ -1777,7 +1809,7 @@ onUnmounted(() => {
       width: 100%;
       min-height: 100%;
       display: flex;
-      align-items: center;
+      // align-items: center;
       flex-direction: column;
       height: auto;
       padding: 40px;
@@ -1789,6 +1821,19 @@ onUnmounted(() => {
         line-height: 24px;
       }
 
+      .c_t15_msg {
+        display: flex;
+        align-items: center;
+        font-size: .9rem;
+        font-weight: 400;
+        gap: 1rem;
+
+        &>span {
+          text-decoration: underline;
+          cursor: pointer;
+        }
+      }
+
       .c_t15_type {
         font-weight: 400;
         font-size: 15px;
@@ -1796,7 +1841,7 @@ onUnmounted(() => {
         letter-spacing: 0.5px;
         color: rgba(0, 0, 0, 1);
         opacity: 0.5;
-        margin-top: 20px;
+        margin: 10px 0;
       }
 
       .c_t15_content {
@@ -2060,7 +2105,7 @@ onUnmounted(() => {
       width: 100%;
       min-height: 100%;
       display: flex;
-      align-items: center;
+      // align-items: center;
       flex-direction: column;
       height: auto;
       padding: 40px;
@@ -2079,7 +2124,20 @@ onUnmounted(() => {
         letter-spacing: 0.5px;
         color: rgba(0, 0, 0, 1);
         opacity: 0.5;
-        margin-top: 20px;
+        margin: 10px 0;
+      }
+
+      .c_t72_msg {
+        display: flex;
+        align-items: center;
+        font-size: .9rem;
+        font-weight: 400;
+        gap: 1rem;
+
+        &>span {
+          text-decoration: underline;
+          cursor: pointer;
+        }
       }
 
       .c_t72_content {
@@ -2267,7 +2325,7 @@ onUnmounted(() => {
       width: 100%;
       min-height: 100%;
       display: flex;
-      align-items: center;
+      // align-items: center;
       flex-direction: column;
       height: auto;
       padding: 40px;
@@ -2286,7 +2344,20 @@ onUnmounted(() => {
         letter-spacing: 0.5px;
         color: rgba(0, 0, 0, 1);
         opacity: 0.5;
-        margin-top: 20px;
+        margin: 10px 0;
+      }
+
+      .c_t73_msg {
+        display: flex;
+        align-items: center;
+        font-size: .9rem;
+        font-weight: 400;
+        gap: 1rem;
+
+        &>span {
+          text-decoration: underline;
+          cursor: pointer;
+        }
       }
 
       .c_t73_content {