Переглянути джерело

Merge branch 'fix/oral-to-writing-redirect' of FanYanPeng/EAIFrontend into host-nju

JiangPengYu 9 місяців тому
батько
коміт
5b0e47406b

+ 2 - 1
src/apis/doubao.ts

@@ -22,7 +22,8 @@ const doubaoApis = {
                 audioUrl,
                 audioTime,
                 voiceCode
-            }
+            },
+            timeout: 60000 // AI 对话响应需要更长时间,设置为60秒
         });
     },
 

+ 4 - 2
src/apis/media.ts

@@ -11,7 +11,8 @@ const mediaApis = {
                 userId,
                 assignmentId,
                 index
-            }
+            },
+            timeout: 30000 // 音频分析需要较长时间
         })
     },
     getAudioSentiment:(userId: Number, assignmentId: Number, index: Number)=>{
@@ -20,7 +21,8 @@ const mediaApis = {
                 userId,
                 assignmentId,
                 index
-            }
+            },
+            timeout: 30000 // 情感分析需要较长时间
         })
     },
     getSpeakingSuggestion:(userId: Number, assignmentId: Number) => {

+ 10 - 1
src/views/AiSpeakingPage/SpeakingPage.vue

@@ -561,8 +561,17 @@ const sendMessage = () => {
           .catch((err) => {
             // 移除"正在思考中"消息
             chatMessages.value = chatMessages.value.filter(msg => !msg.isThinking);
-            chatMessages.value.push({ sender: 'ai', text: '服务器繁忙,请稍后再试...', isPlaying: false });
+            console.error('AI 响应失败:', err);
+            // 判断是否是超时错误
+            const errorMessage = err.code === 'ECONNABORTED' || err.message.includes('timeout') 
+              ? 'AI 响应超时,但消息可能已发送成功,请稍后刷新查看' 
+              : '服务器繁忙,请稍后再试...';
+            chatMessages.value.push({ sender: 'ai', text: errorMessage, isPlaying: false });
             isLoading.value = false;
+            // 如果是超时,建议刷新获取最新消息
+            if (err.code === 'ECONNABORTED' || err.message.includes('timeout')) {
+              ElMessage.warning('响应超时,建议稍后刷新页面查看 AI 回复');
+            }
           });
       })
       .catch((uploadErr) => {

+ 14 - 3
src/views/AiSpeakingPage/SpeakingRecord.vue

@@ -985,10 +985,21 @@ const goBack = () => {
       }
     });
   } else {
-    // 老师保持原有逻辑,返回批改页面
+    // 老师返回到批改页面(CoursePage),并自动选中对应的课程和作业
+    if (!courseId.value) {
+      ElMessage.warning('获取课程信息失败,将返回批改列表');
+      router.push({ name: 'myCorrectWithCourse' });
+      return;
+    }
+    
+    console.log('AI口语批改返回,courseId:', courseId.value, 'assignmentId:', props.assignmentId);
     router.push({
-      name: 'myCorrectWithAssignmentId',
-      params: { assignmentId: props.assignmentId }
+      name: 'myCorrectWithCourse',
+      query: {
+        courseId: courseId.value.toString(),
+        assignmentId: props.assignmentId.toString(),
+        fromCorrect: 'true' // 标记是从批改页面返回
+      }
     });
   }
 };

+ 72 - 9
src/views/CorrectPage/CoursePage.vue

@@ -118,7 +118,12 @@
         <div class="assignment-body">
           <!-- 课程作业标题 -->
           <div class="assignment-title-section">
-            <h3 class="assignment-full-title">{{ selectedAssignment.courseName }}:{{ selectedAssignment.assignmentName }}</h3>
+            <h3 class="assignment-full-title">
+              {{ selectedAssignment.courseName }}:{{ selectedAssignment.assignmentName }}
+              <span class="assignment-type-badge" :class="getAssignmentTypeClass(selectedAssignment.type)">
+                {{ getAssignmentTypeLabel(selectedAssignment.type) }}
+              </span>
+            </h3>
           </div>
           
           <!-- 搜索筛选栏 -->
@@ -433,12 +438,15 @@
       const assignment = course.assignments.find(a => a.assignmentId === assignmentId)
       if (assignment) {
         assignment.active = true
+        // 从rawAssignments中获取完整的作业信息,包括type
+        const fullAssignment = rawAssignments.find(a => a.assignmentId === assignmentId)
         // 设置选中的作业信息
         selectedAssignment.value = {
           assignmentId: assignment.assignmentId,
           assignmentName: assignment.assignmentName,
           courseName: course.courseName,
-          courseId: course.courseId
+          courseId: course.courseId,
+          type: fullAssignment?.type || ''
         }
         
         // 加载相关数据
@@ -671,18 +679,49 @@
     return status === 'LATE_SUBMITTED' || status === 'LATE_SUBMITTED_CORRECTED'
   }
   
+  // 获取作业类型标签文本
+  const getAssignmentTypeLabel = (type: string) => {
+    if (!type) return ''
+    if (type === 'AI_SPEAKING' || type === 'AI口语') return 'AI口语'
+    if (type === 'WRITING' || type === '写作') return '写作'
+    return type
+  }
+  
+  // 获取作业类型标签样式
+  const getAssignmentTypeClass = (type: string) => {
+    if (!type) return ''
+    if (type === 'AI_SPEAKING' || type === 'AI口语') return 'type-ai-speaking'
+    if (type === 'WRITING' || type === '写作') return 'type-writing'
+    return ''
+  }
+  
   // 处理批改操作
   const handleCorrect = (row: StudentAssignmentStatusDTO) => {
     console.log('批改学生作业:', row)
     
-    // 跳转到批改页面,路径为 home/assignment/:assignmentId/correct,并传递studentId参数
     if (selectedAssignment.value) {
-      router.push({
-        path: `/home/assignment/${selectedAssignment.value.assignmentId}/correct`,
-        query: {
-          studentId: row.studentId.toString()
-        }
-      })
+      const assignmentType = selectedAssignment.value.type
+      
+      // 根据作业类型跳转到不同的批改页面
+      if (assignmentType === 'AI_SPEAKING' || assignmentType === 'AI口语') {
+        // 跳转到口语作业批改页面
+        router.push({
+          path: `/home/assignment/${selectedAssignment.value.assignmentId}/airecord`,
+          query: {
+            userId: row.studentId.toString(),
+            assignmentId: selectedAssignment.value.assignmentId.toString(),
+            assignmentName: selectedAssignment.value.assignmentName
+          }
+        })
+      } else {
+        // 跳转到写作作业批改页面(默认)
+        router.push({
+          path: `/home/assignment/${selectedAssignment.value.assignmentId}/correct`,
+          query: {
+            studentId: row.studentId.toString()
+          }
+        })
+      }
     }
   }
   
@@ -1244,6 +1283,30 @@ export default {
     color: #333;
     margin: 0;
     font-family: "Noto Sans SC", sans-serif;
+    display: flex;
+    align-items: center;
+    gap: 12px;
+  }
+  
+  /* 作业类型标签样式 */
+  .assignment-type-badge {
+    padding: 4px 12px;
+    border-radius: 4px;
+    font-size: 12px;
+    font-weight: 500;
+    display: inline-flex;
+    align-items: center;
+    font-family: "Noto Sans SC", sans-serif;
+  }
+  
+  .type-ai-speaking {
+    background-color: #70BBD9;
+    color: white;
+  }
+  
+  .type-writing {
+    background-color: #7ADBB0;
+    color: white;
   }
   
   /* 筛选区域样式 */

+ 3 - 1
src/views/LoginPage/component/Login.vue

@@ -174,7 +174,9 @@
         store.setToken(data?.token)
         localStorage.setItem('Authorization', data?.token);
         localStorage.setItem('User', JSON.stringify(data));
-        router.push(`/home`)
+        router.push(`/home`).then(() => {
+          window.location.reload();
+        });
       } else if(_res.data.code === 400){
         ElMessage({message: '邮箱或验证码错误' + _res.data.msg, type: 'error'})
       }