瀏覽代碼

1、增加编程课修建模块暂停时间
2、AI实验课移除无用配置
3、AI智能问答加入前置问答和AI回复补充功能(后端配置读取)
4、加入浏览器会话存储AI实验课智能问答会话ID(目前没有调用历史对话记录)

liyanbo 3 月之前
父節點
當前提交
2624db5a35
共有 3 個文件被更改,包括 73 次插入48 次删除
  1. 48 10
      src/components/ai/text/TextToText.vue
  2. 1 0
      src/components/blockly/MapGame.vue
  3. 24 38
      src/views/laboratory/ExperimentalInterface.vue

+ 48 - 10
src/components/ai/text/TextToText.vue

@@ -113,6 +113,12 @@ const leftPanelRef = ref(null);
 
 // 定义props
 const props = defineProps({
+  //根据需求传输
+  courseId: { type: Number},
+  conversationId: { type: String},
+  preDialogueList: { type: Array, default: () => []},
+  replySupplement: { type: String, default: ''},
+
   personId: { type: Number},
   personName: { type: String },
   personImage: { type: String},
@@ -198,6 +204,12 @@ const getConversation = async (id) => {
   activeConversation.value = conversation;
   // activeConversationId.value = personId.value
   activeConversationModelPath.value = personImage.value;
+
+
+  // 获取对话消息列表【后面补充接口】
+  // activeMessageList.value = await ChatMessageApi.getChatMessageListByConversationId(
+  //     activeConversationId.value
+  // )
 };
 
 // 语音输入识别结果处理
@@ -279,7 +291,7 @@ const doSendMessage = async (content) => {
     return;
   }
   if (activeConversationId.value == null) {
-    console.error("还没创建对话,不能发送!");
+    console.error("请刷新创建新对话!");
     return;
   }
   // 递增消息计数器
@@ -405,6 +417,7 @@ const stopStream = async () => {
   if (conversationInAbortController.value) {
     conversationInAbortController.value.abort();
   }
+
   // 设置为 false
   conversationInProgress.value = false;
 };
@@ -443,6 +456,12 @@ const messageList = computed(() => {
       content: activeConversation.value.systemMessage,
     };
     activeMessageList.value.push(systemMessage);
+
+    // 加入预置对话
+    props.preDialogueList.forEach(item => {
+      activeMessageList.value.push(item);
+    })
+
     return [systemMessage];
   }
   return [];
@@ -519,6 +538,14 @@ const textRoll = async () => {
         // 重新设置任务
         timer = setTimeout(task, textSpeed.value);
       } else {
+        // 文本完全显示且对话已结束,添加补充信息
+        if (!conversationInProgress.value && props.replySupplement) {
+          activeMessageList.value.push({
+            type: "system",
+            content: props.replySupplement,
+          });
+        }
+
         // 不是对话中可以结束
         if (!conversationInProgress.value) {
           textRoleRunning.value = false;
@@ -569,15 +596,26 @@ onMounted(async () => {
   // 确保selectedImage被设置
   selectedImage.value = personImage.value;
 
-  // 智能问答
-  CreateDialogue({ roleId: personId.value })
-      .then((res) => {
-        console.log("创建会话:", res);
-        activeConversationId.value = res.data;
-      })
-      .catch((error) => {
-        console.error("请求出错:", error);
-      });
+  //创建对话
+  if (props.conversationId) {
+    activeConversationId.value = props.conversationId;
+  }else{
+    // 智能问答
+    CreateDialogue({ roleId: personId.value })
+        .then((res) => {
+          console.log("创建会话:", res);
+          activeConversationId.value = res.data;
+
+          //将会话存入会话缓存
+          if(props.courseId){
+            localStorage.setItem(localStorage.getItem("token") + "-" + props.courseId, activeConversationId.value)
+          }
+        })
+        .catch((error) => {
+          console.error("请求出错:", error);
+        });
+  }
+
   await getConversation(personId.value);
   // 获取列表数据
   // activeMessageListLoading.value = true

+ 1 - 0
src/components/blockly/MapGame.vue

@@ -1335,6 +1335,7 @@ window.construct = async function() {
     return;
   }
 
+  await new Promise(resolve => setTimeout(resolve, CONFIG.DELAY.TEMP_ITEM_FADE_DURATION));
   //处理特殊任务消失
   processingSpecialTasksDisappearing()
 };

+ 24 - 38
src/views/laboratory/ExperimentalInterface.vue

@@ -47,40 +47,27 @@
           <PptView v-if="course.courseContentType === 'ppt'" :pptPath="course.courseContent" ref="pptRef"></PptView>
 
           <!--文生文-->
-          <TextToText class="contentClass" v-if="course.courseContentType === 'aiTextToText'" ref="aiTextToText"></TextToText>
+          <TextToText class="contentClass" v-if="course.courseContentType === 'aiTextToText'" ref="aiTextToText"
+                      :courseId="course.id"
+                      :conversationId="course.conversationId"
+                      :preDialogueList="course.aiPreDialogueList"
+                      :replySupplement="course.aiReplySupplement"></TextToText>
 
           <!--文生图-->
-          <TextToImage class="contentClass" v-if="course.courseContentType === 'aiTextToImage'" ref="aiTextToImage"></TextToImage>
+          <TextToImage class="contentClass" v-if="course.courseContentType === 'aiTextToImage'" ref="aiTextToImage"
+                       :preDialogueList="course.aiPreDialogueList"
+                       :replySupplement="course.aiReplySupplement"></TextToImage>
 
           <!--图生图-->
-          <ImageToImage class="contentClass" v-if="course.courseContentType === 'aiImageToImage'" ref="aiImageToImage"></ImageToImage>
+          <ImageToImage class="contentClass" v-if="course.courseContentType === 'aiImageToImage'" ref="aiImageToImage"
+                        :preDialogueList="course.aiPreDialogueList"
+                        :replySupplement="course.aiReplySupplement"></ImageToImage>
 
           <!--图生视频-->
-          <ImageToVideo class="contentClass" v-if="course.courseContentType === 'aiImageToVideo'" ref="aiImageToVideo"></ImageToVideo>
+          <ImageToVideo class="contentClass" v-if="course.courseContentType === 'aiImageToVideo'" ref="aiImageToVideo"
+                        :preDialogueList="course.aiPreDialogueList"
+                        :replySupplement="course.aiReplySupplement"></ImageToVideo>
           
-          <!--编程地图游戏-->
-          <MapGame v-if="course.courseContentType === 'blockly'"
-                   :game-id="course.id"
-                   :map-background="course.blocklyBackground"
-                   :map-tile-size="course.blocklyTileSize"
-                   :map-start-point="course.blocklyStartPoint"
-                   :map-end-point="course.blocklyEndPoint"
-                   :map-walkable-points="course.blocklyWalkablePoints"
-                   :user-direction="course.blocklyUserDirection"
-                   :route-list="course.blocklyRouteList"
-                   :user-image="course.blocklyUserImage"
-                   :info="course.blocklyInfo"
-                   :game-title="course.courseName"
-                   :course-list="props.courseList"
-                   :blockly-special-blocks="course.blocklySpecialBlocks"
-                   :current-index="currentCourseIndex"
-                   @close-game="emit('closeVideo')"
-                   @prev-section="playPreviousVideo"
-                   @next-section="playNextVideo"
-                   @saveProgress="handleSaveProgress"
-                   v-memo="[course.id, course.courseContentType]"
-          ></MapGame>
-
         </template>
 
         <!-- 视频切换按钮 - 始终显示 -->
@@ -328,20 +315,19 @@ const handleParentCourseData = (courseData = props.courseData) => {
     courseContent: courseData.acContent,
     courseConfigList: courseData.aiCourseConfigList,
     key: courseData.id.toString(),
-    // blockly相关属性,用于MapGame组件
-    blocklyBackground: courseData.aiCourseBackground,
-    blocklyTileSize: courseData.aiCourseTileSize,
-    blocklyStartPoint: courseData.aiCourseStartPoint,
-    blocklyEndPoint: courseData.aiCourseEndPoint,
-    blocklyWalkablePoints: courseData.aiCourseWalkablePoints,
-    blocklyUserDirection: courseData.aiCourseUserDirection || 0,
-    blocklyRouteList: courseData.aiCourseRouteList,
-    blocklyUserImage: courseData.aiCourseUserImage,
-    blocklyInfo: courseData.aiCourseInfo,
-    blocklySpecialBlocks: courseData.aiCourseSpecialBlocks ? courseData.aiCourseSpecialBlocks.split(',') : [],
+
+    // 数字人额外配置
+    aiPreDialogueList: courseData.aiPreDialogues ? JSON.parse(courseData.aiPreDialogues) : [],
+    aiReplySupplement: courseData.aiReplySupplement,
+
     isDisabled: courseData.isDisabled,
   }
   courseId.value = course.value.id
+
+  // 设置对话ID
+  course.value.conversationId = localStorage.getItem(localStorage.getItem("token") + "-" + course.value.id)
+  console.log(course.value.conversationId)
+
   // 如果有配置,禁用视频检查
   if (courseData.isDisabled) {
     Message().notifyWarning('您的账号并未开放此课程!', true)