Bladeren bron

Merge branch 'beta'

lsc 1 jaar geleden
bovenliggende
commit
5b3ca1b203

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.ba342fc425e0b8a1a5256e8bc083cd7b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.571c38d63f24b1ae9e16.js></script><script type=text/javascript src=./static/js/vendor.3cd0a0187ca1f70ded67.js></script><script type=text/javascript src=./static/js/app.acb4aeb604c8117f99e3.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.e516004b3514e27d2f56aec941a118b7.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.571c38d63f24b1ae9e16.js></script><script type=text/javascript src=./static/js/vendor.3cd0a0187ca1f70ded67.js></script><script type=text/javascript src=./static/js/app.aae4f18dde370c7673dc.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.e516004b3514e27d2f56aec941a118b7.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.e516004b3514e27d2f56aec941a118b7.css.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.aae4f18dde370c7673dc.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.aae4f18dde370c7673dc.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/manifest.571c38d63f24b1ae9e16.js.map


+ 130 - 130
src/components/pages/aiAddCourse/addCourse.vue

@@ -12288,7 +12288,7 @@ export default {
         this.aitype = "aiTask"
         var _text = ""
         for (var i = 0; i < this.teacherText.length; i++) {
-          _text += `任务名称:${this.teacherText[i].task} 教案:${this.teacherText[i].detail} \n`
+          _text += `任务名称:${this.teacherText[i].task} 教案:${this.teacherText[i].detail.replaceAll('#','').replaceAll('*','').replaceAll('-','').replaceAll('\n','')}`
         }
         this.aiText = `请根据${_text}。`
         this.aiCallBack = callback
@@ -12370,40 +12370,40 @@ export default {
       } else if (this.aitype == "aiOutline") {
         this.loading = true
         let message = `
-              ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 
-              --------
-              ## 要求 
-              ${msg} **你需要使用5EX教学活动设计框架,其定义参考#补充参考资料 中的5EX定义**。以及##补充参考资料,
-              然后根据Format example的要求返回要以数组的格式
+--------
+## 要求 
+${msg} **你需要使用5EX教学活动设计框架,其定义参考#补充参考资料 中的5EX定义**。以及##补充参考资料,
+然后根据Format example的要求返回要以数组的格式
 
-              --------
-              ## Format example
-              [
-                      {
-                        "task": "任务名称1",
-                        "detail": "任务设计和评价标准"
-                      },
-                      {
-                        "task": "任务名称2",
-                        "detail": "任务设计和评价标准"
-                      }
-              ]
-
-              --------
-              ## 补充参考资料
-              - 5EX定义:
-              # 角色介绍
-              5EX是一种跨学科学习活动设计模型,专门用于STEM(科学、技术、工程和数学)教育项目。它的核心理念是通过整合不同学科的知识和方法,解决真实情境中的问题,从而促进学生的全面发展。5EX模型包含以下五个关键环节:
-              1.EQ(Enter and Questions)- 进入情境与提出问题:此环节的目的让学生进入真实的问题情境中,提出问题和任务。教师可以通过多种活动方式,如阅读科普资料、观看相关视频、参观实际场所等,引导学生发现问题并思考。这一步骤强调问题驱动的学习,让学生以项目学习的方式参与主题学习。
-              2.EM(Exploration and Mathematics)- 探究学习与数学应用:在这个环节中,学生围绕提出的问题或任务,运用科学探究方法(如实验、观察、调查)和数学方法去寻求解决方案或解析问题。数学应用在此环节中是基础,帮助学生通过数据收集、分析和解释来理解问题和应用知识。
-              3.ET(Engineering and Technology)- 工程设计与技术制作:此环节让学生承担任务,通过工程设计和动手制作来完成任务。学生需要进行头脑风暴,提出解决方案,选择材料和工具,并合作完成成品制作。这个过程中,学生将体验完整的工程设计和技术制作流程,并通过测试和改进来完善自己的作品。
-              4.EC(Expansion and Creativity)- 知识扩展与创意设计:本环节鼓励学生将所学知识与社会需求相结合,提出更高要求的设计任务,激发学生的创新能力。学生需要进行创意设计,将知识应用于实际问题的解决中,从而扩展知识面并提出创新的设计方案。
-              5.ER(Evaluation and Reflection)- 多元评价与学习反思:此环节通过多元评价方式检验学生是否达到了学习目标,并提供课程改进的依据。评价不仅包括教师的评价,还涉及学生自评和同伴评价。此外,学生通过自我反思能够监控和掌握自己的学习状况,识别知识和能力掌握的程度,以及评估还需要参与的学习过程。
-
-              补充资料:${url.join(",")}
-              补充描述:${this.courseText2}
-              `
+--------
+## Format example
+[
+        {
+          "task": "任务名称1",
+          "detail": "任务设计和评价标准"
+        },
+        {
+          "task": "任务名称2",
+          "detail": "任务设计和评价标准"
+        }
+]
+
+--------
+## 补充参考资料
+- 5EX定义:
+# 角色介绍
+5EX是一种跨学科学习活动设计模型,专门用于STEM(科学、技术、工程和数学)教育项目。它的核心理念是通过整合不同学科的知识和方法,解决真实情境中的问题,从而促进学生的全面发展。5EX模型包含以下五个关键环节:
+1.EQ(Enter and Questions)- 进入情境与提出问题:此环节的目的让学生进入真实的问题情境中,提出问题和任务。教师可以通过多种活动方式,如阅读科普资料、观看相关视频、参观实际场所等,引导学生发现问题并思考。这一步骤强调问题驱动的学习,让学生以项目学习的方式参与主题学习。
+2.EM(Exploration and Mathematics)- 探究学习与数学应用:在这个环节中,学生围绕提出的问题或任务,运用科学探究方法(如实验、观察、调查)和数学方法去寻求解决方案或解析问题。数学应用在此环节中是基础,帮助学生通过数据收集、分析和解释来理解问题和应用知识。
+3.ET(Engineering and Technology)- 工程设计与技术制作:此环节让学生承担任务,通过工程设计和动手制作来完成任务。学生需要进行头脑风暴,提出解决方案,选择材料和工具,并合作完成成品制作。这个过程中,学生将体验完整的工程设计和技术制作流程,并通过测试和改进来完善自己的作品。
+4.EC(Expansion and Creativity)- 知识扩展与创意设计:本环节鼓励学生将所学知识与社会需求相结合,提出更高要求的设计任务,激发学生的创新能力。学生需要进行创意设计,将知识应用于实际问题的解决中,从而扩展知识面并提出创新的设计方案。
+5.ER(Evaluation and Reflection)- 多元评价与学习反思:此环节通过多元评价方式检验学生是否达到了学习目标,并提供课程改进的依据。评价不仅包括教师的评价,还涉及学生自评和同伴评价。此外,学生通过自我反思能够监控和掌握自己的学习状况,识别知识和能力掌握的程度,以及评估还需要参与的学习过程。
+
+补充资料:${url.join(",")}
+补充描述:${this.courseText2}
+`
 
         this.aiGet2(message, () => {
           this.loading = false
@@ -12510,30 +12510,30 @@ ${msg} 以及#补充参考资料 输出格式和内容要求参考##格式与要
       } else if (this.aitype == "aiTeacher") {
         this.loading = true
         let message = `
-            ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 
-            --------
-            ## 要求
-            ${msg} 以及##补充参考资料, 然后根据Format example的要求返回要以数组的格式
+--------
+## 要求
+${msg} 以及##补充参考资料, 然后根据Format example的要求返回要以数组的格式
 
-            
-            --------
-            ## 补充参考资料
-            补充资料:${url.join(",")}
-            补充描述:${this.courseText2}
 
-            --------
-            ## Format example
-            [
-              {
-                "task": "任务名称1",
-                "detail": "教案"
-              },
-              {
-                 "task": "任务名称2",
-                 "detail": "教案"
-              }
-            ]`
+--------
+## 补充参考资料
+补充资料:${url.join(",")}
+补充描述:${this.courseText2}
+
+--------
+## Format example
+[
+  {
+    "task": "任务名称1",
+    "detail": "教案"
+  },
+  {
+      "task": "任务名称2",
+      "detail": "教案"
+  }
+]`
         this.aiGet4(message, () => {
           this.loading = false
           this.isOutline2 = true
@@ -12581,22 +12581,22 @@ ${msg} 以及#补充参考资料 输出格式和内容要求参考##格式与要
         }
       }
       let msg = `
-        ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
-
-        --------
-        ## 要求
-        ${message} 以及##补充参考资料 以文本格式输出项目概况,驱动性问题,最终作品,格式参考## Format example
-
-        --------
-        ## 补充参考资料
-        补充资料:${url.join(",")}
-        补充描述:${this.courseText2}
-
-        --------
-        ## Format example
-        -课程简要描述:
-        -驱动性问题:**1个**驱动整个项目的问题
-        -最终作品:对应解决驱动性问题的作品,可个人可团队`
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
+
+--------
+## 要求
+${message} 以及##补充参考资料 以文本格式输出项目概况,驱动性问题,最终作品,格式参考## Format example
+
+--------
+## 补充参考资料
+补充资料:${url.join(",")}
+补充描述:${this.courseText2}
+
+--------
+## Format example
+-课程简要描述:
+-驱动性问题:**1个**驱动整个项目的问题
+-最终作品:对应解决驱动性问题的作品,可个人可团队`
       this.aiGet(msg)
     },
     setUnitJson() {
@@ -12860,16 +12860,16 @@ ${msg} 以及#补充参考资料 输出格式和内容要求参考##格式与要
         }
       }
       let messages = `
-      ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
 
-      --------
-      ## 要求
-      ${msg} 以文本格式输出任务设计和评价标准
-        
-      ## 补充参考资料
-      - 补充资料:${url.join(",")}
-      - 补充描述:${this.courseText2}
-      `
+--------
+## 要求
+${msg} 以文本格式输出任务设计和评价标准
+  
+## 补充参考资料
+- 补充资料:${url.join(",")}
+- 补充描述:${this.courseText2}
+`
       _this.taskDetailLoading.push(_tindex)
       _this.ttaskDetailLoading.push(_tindex)
       let _uuid = uuidv4();
@@ -12948,15 +12948,15 @@ ${msg} 以及#补充参考资料 输出格式和内容要求参考##格式与要
       const _tindex = 'task-' + index
       const _tindex2 = index
       let messages = `
-      ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
 
-      --------
-      ## 要求
-      ${msg} 
+--------
+## 要求
+${msg} 
 
-      # 格式与要求
-      - 任务名:
-      - 任务描述:该描述是教师给与学生的指示(用于指导学生如何进行教学活动),对应到学生活动,你应该用友好,但是又清晰明确的口吻来撰写。`
+# 格式与要求
+- 任务名:
+- 任务描述:该描述是教师给与学生的指示(用于指导学生如何进行教学活动),对应到学生活动,你应该用友好,但是又清晰明确的口吻来撰写。`
       _this.taskDetailLoading2.push(_tindex)
       _this.ttaskDetailLoading2.push(_tindex)
       let _uuid = uuidv4();
@@ -13035,21 +13035,21 @@ ${msg} 以及#补充参考资料 输出格式和内容要求参考##格式与要
       const _tindex3 = tindex
       // **重点考虑该任务及工具名和工具内容的情况下*
       let messages = `
-      ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
 
-      --------
-      ## 参考内容
-      任务名称:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].task}
-      任务描述:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].taskDetail}
-      工具名称:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].toolChoose[_tindex3].tool[0] ? _this.toolsData[_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].toolChoose[_tindex3].tool[0]] : '无'}
-      工具内容:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].toolChoose[_tindex3].toolDetail}
+--------
+## 参考内容
+任务名称:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].task}
+任务描述:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].taskDetail}
+工具名称:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].toolChoose[_tindex3].tool[0] ? _this.toolsData[_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].toolChoose[_tindex3].tool[0]] : '无'}
+工具内容:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].toolChoose[_tindex3].toolDetail}
 
-      --------
-      ## 要求
-      ${msg} 输出格式和内容要求参考#格式与要求
+--------
+## 要求
+${msg} 输出格式和内容要求参考#格式与要求
 
-      # 格式与要求
-      -工具指引:以友好,明确的口吻告诉学生该如何使用该工具`
+# 格式与要求
+-工具指引:以友好,明确的口吻告诉学生该如何使用该工具`
       _this.taskDetailLoading3.push(_tindex)
       _this.ttaskDetailLoading3.push(_tindex)
       let _uuid = uuidv4();
@@ -13135,29 +13135,29 @@ ${msg} 以及#补充参考资料 输出格式和内容要求参考##格式与要
       }
       // **重点考虑该任务详情**
       let messages = `
-      ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
-
-      --------
-      ## 参考内容
-      任务名称:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].task}
-      任务描述:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].taskDetail}
-      评价设计:${_text}
-
-      --------
-      ## 要求
-      ${msg} 输出格式和内容要求参考# 格式与要求
-
-      --------
-      # 格式与要求
-      -评价标准:至少3条评价标准,这个评价是教师用来评价学生表现的,需要包含评价维度,以及该维度中教师期待学生的表现,句式为学生应该能....
-
-      --------
-      ## Format example
-      [
-        {"value":"评价维度1","detail":"维度描述1","score":5},
-        {"value":"评价维度2","detail":"维度描述2","score":5},
-        {"value":"评价维度3","detail":"维度描述3","score":5}
-      ]`
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
+
+--------
+## 参考内容
+任务名称:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].task}
+任务描述:${_this.unitJson[0].chapterInfo[0].taskJson[_tindex2].taskDetail}
+评价设计:${_text}
+
+--------
+## 要求
+${msg} 输出格式和内容要求参考# 格式与要求
+
+--------
+# 格式与要求
+-评价标准:至少3条评价标准,这个评价是教师用来评价学生表现的,需要包含评价维度,以及该维度中教师期待学生的表现,句式为学生应该能....
+
+--------
+## Format example
+[
+  {"value":"评价维度1","detail":"维度描述1","score":5},
+  {"value":"评价维度2","detail":"维度描述2","score":5},
+  {"value":"评价维度3","detail":"维度描述3","score":5}
+]`
       _this.taskDetailLoading4.push(_tindex)
       let params = JSON.stringify({
         // "model": "Chat",
@@ -13200,15 +13200,15 @@ ${msg} 以及#补充参考资料 输出格式和内容要求参考##格式与要
         }
       }
       let messages = `
-      ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
-
-      --------
-      ## 要求
-      ${msg} 
-              
-      ## 补充参考资料
-      - 补充资料:${url.join(",")}
-      - 补充描述:${this.courseText2}`
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
+
+--------
+## 要求
+${msg} 
+        
+## 补充参考资料
+- 补充资料:${url.join(",")}
+- 补充描述:${this.courseText2}`
       _this.taskDetailLoading5.push(_tindex)
       _this.ttaskDetailLoading5.push(_tindex)
       let _uuid = uuidv4();

+ 1 - 1
src/components/pages/course.vue

@@ -32,7 +32,7 @@
               <!-- <div type="primary" @click="goToCourse2()">任务式课程</div> -->
               <!-- <div type="primary" @click="goToCourse()">阶段式课程</div> -->
               <div type="primary" @click="goToCourse4()">阶段式课程</div>
-              <div type="primary" @click="goToCourse5()" v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5'">AI模式</div>
+              <div type="primary" @click="goToCourse5()" v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5'">AI模式</div>
             </div>
           </button>
         </div>

+ 4 - 4
src/components/pages/pblCourse/component/chatArea.vue

@@ -55,9 +55,9 @@
 			<span class="c_controls_item" @click="clearChat">清空对话</span>
 		</div> -->
 		<div class="c_bottom" 	v-loading="chatLoading">
-			<div class="c_b_record">
+			<!-- <div class="c_b_record">
 				<span></span>
-			</div>
+			</div> -->
 			<div class="c_b_inputArea">
 				<el-input
 					class="c_b_input"
@@ -66,7 +66,7 @@
 				
 				>
 				</el-input>
-				<span></span>
+				<!-- <span></span> -->
 			</div>
 			<div class="c_b_send" @click="send">
 				<span></span>
@@ -482,7 +482,7 @@ export default {
 }
 
 .c_b_inputArea {
-	width: calc(100% - 140px);
+	width: calc(100% - 100px);
 	background-color: #f3f3f3;
 	border-radius: 50px;
 	height: 80%;

+ 4 - 1
src/components/pages/pblCourse/component/doWorkArea.vue

@@ -11,7 +11,10 @@
 			</div>
 		</div>
 		<div class="dw_work">
-			<work :task="task" @submitTask="submitTask" @choiceAnswer="choiceAnswer" @getTaskList="getTaskList" :phase="phase"/>
+			<work v-if="task" :task="task" @submitTask="down" @choiceAnswer="choiceAnswer" @getTaskList="getTaskList" :phase="phase"/>
+			<div v-else>
+				<h3>等待生成数据...</h3>
+			</div>
 		</div>
 		<div class="dw_bottom">
 			<div class="dw_b_btn" @click.stop="submitTask()">

+ 75 - 0
src/components/pages/pblCourse/component/selectTopicDialog.vue

@@ -0,0 +1,75 @@
+<template>
+  <div>
+    <el-dialog
+      title="选题设置"
+      :visible.sync="dialogVisible"
+      width="500px"
+			:show-close="false"
+			:close-on-click-modal="false"
+			:close-on-press-escape="false"
+      v-loading="loading"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="选题:" prop="title">
+          <el-input v-model="form.title"></el-input>
+        </el-form-item>
+			</el-form>
+      <span slot="footer" class="shareFooter">
+        <el-button type="primary" @click="submitFrom('form')">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      loading: false,
+      form: {
+        title:"",
+      },
+			rules:{
+				title:[
+					{ required: true, message: '请输入选题', trigger: 'blur' },
+				]
+			}
+    };
+  },
+  watch: {
+    
+  },
+  methods: {
+    open() {
+      this.dialogVisible = true;
+    },
+    close() {
+      this.dialogVisible = false;
+      this.form = {
+        title:""
+      };
+    },
+		submitFrom(formName){
+			this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.$emit("success",this.form);
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+		},
+
+  }
+};
+</script>
+
+<style scoped>
+.shareContent {
+  width: 500px;
+  max-width: 500px;
+  height: auto;
+}
+
+</style>

+ 55 - 13
src/components/pages/pblCourse/component/work.vue

@@ -12,10 +12,10 @@
 				</div>
 			</div>
 			<div class="w_nw_introduce">
-				<div v-html="task.target" style="font-weight: bold;"></div>
-				<div v-html="task.detail"></div>
-				<div v-html="task.steps"></div>
-				<div v-html="task.tips"></div>
+				<div v-html="htmlText(task.target)" style="font-weight: bold;"></div>
+				<div v-html="htmlText(task.detail)"></div>
+				<div v-html="htmlText(task.steps)"></div>
+				<div v-html="htmlText(task.tips)"></div>
 			</div>
 		</div>
 		<div class="w_doWork">
@@ -25,15 +25,16 @@
 					<span>通关挑战({{taskIndex+1}}/{{task.answerArray?task.answerArray.length:5}})</span>
 				</div>
 				<div class="w_dw_h_controls">
-					<span @click.stop="back()">上一题</span>
-					<span @click.stop="down()">下一题</span>
+					<span @click.stop="back()" :class="[taskIndex==0?'w_dw_h_c_disabled':'']">上一题</span>
+					<span @click.stop="down()" v-show="taskIndex!=4">下一题</span>
+					<span @click.stop="submitTask()" class="w_dw_h_c_submit" v-show="taskIndex==4">提交</span>
 				</div>
 			</div>
 			<div class="w_dw_work">
-					<span class="w_dw_w_title">{{ taskIndex+1 }}.{{ task.answerArray[taskIndex].title }}</span>
+					<span class="w_dw_w_title">{{ taskIndex+1 }}.{{ task.answerArray?task.answerArray[taskIndex].title:"" }}</span>
 					<div class="w_dw_w_radio">
 						<el-radio-group class="w_dw_w_r_group" v-model="task.answerArray[taskIndex].userAnswer" size="medium" @input="choiceAnswer">
-  					  <el-radio class="w_dw_w_r_g_item" v-for="(item,index) in task.answerArray[taskIndex].option" :key="index+''+taskIndex" size="medium " :label="index" @input="choiceAnswer">{{ item }}</el-radio>
+  					  <el-radio class="w_dw_w_r_g_item" v-for="(item,index) in task.answerArray?task.answerArray[taskIndex].option:[]" :key="index+''+taskIndex" size="medium " :label="index" @input="choiceAnswer">{{ item }}</el-radio>
   					</el-radio-group>
 					</div>
 				</div>
@@ -42,7 +43,7 @@
 </template>
 
 <script>
-	
+	import MarkdownIt from "markdown-it";
 	export default {
 		emits:['choiceAnswer','submitTask',"getTaskList"],
 		props:{
@@ -50,7 +51,9 @@
 				type:Object,
 				default:()=>{
 					return{
-						
+						answerArray:[
+							{}
+						]
 					}
 				},
 				
@@ -69,12 +72,25 @@
 		data(){
 			return{
 				taskIndex:0,
+				detail:"",
+				steps:"",
+				target:"",
+				tips:"",
+			}
+		},
+		computed:{
+			htmlText(){
+				return (mdText)=>{
+					const md = new MarkdownIt();
+					return md.render(mdText)
+				}
 			}
 		},
 		watch:{
 			task(){
 				this.taskIndex = 0;
-				this.$refs.workRef.scrollTop = 0;
+				this.$refs.workRef?this.$refs.workRef.scrollTop = 0:'';
+				// this.$refs.workRef.scrollTop = 0;
 			}
 		},
 		methods:{
@@ -82,16 +98,20 @@
 				this.$emit("getTaskList",this.phase.atPhase)
 			},
 			back(){
-				if(this.taskIndex==0)return this.$message.info("已经是第一题咯");
+				if(this.taskIndex==0)return;
 				this.taskIndex-=1;
 			},
 			down(){
-				if(this.taskIndex>=(this.task?this.task.answerArray.length-1:5))return this.$message.info("已经是最后一题咯");
+				if(this.taskIndex>=(this.task?this.task.answerArray.length-1:5))return;
 				this.taskIndex+=1;
 			},
 			choiceAnswer(_index){
 				this.$emit("choiceAnswer",[this.taskIndex,_index])
 				this.$forceUpdate();
+			},
+			submitTask(){
+				if((this.phase.doPhase>this.phase.atPhase) || this.phase.doPhase>=5)return this.$message.error("该阶段已提交过了")
+				this.$emit("submitTask")
 			}
 		}
 	}
@@ -236,6 +256,23 @@
 	align-items: center;
 }
 
+.w_dw_h_c_disabled{
+	opacity: .5;
+	cursor: not-allowed !important;
+}
+
+.w_dw_h_c_submit{
+	background:linear-gradient(to right,#6082E5,#A293F3);
+	color: white;
+	padding: 0 23px !important;
+	/* 不可选中 */
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+
 .w_dw_h_controls>span{
 	font-size: 16px;
 	margin-left: 20px;
@@ -250,6 +287,11 @@
 	align-items: center;
 	border-radius: 100px;
 	border: solid 1px #AD88FD;
+	/* 不可选中 */
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
 }
 
 .w_dw_h_controls>span:hover{

+ 92 - 64
src/components/pages/pblCourse/index.vue

@@ -11,6 +11,7 @@
 		<div class="pc_right">
 			<chatArea />
 		</div>
+		<selectTopicDialog ref="selectTopicDialogRef" @success="selectTopicSuccess"/>
 	</div>
 </template>
 
@@ -19,12 +20,13 @@ import chatArea from './component/chatArea'
 import doWorkArea from './component/doWorkArea'
 import procedureArea from './component/procedureArea'
 import { v4 as uuidv4 } from "uuid";
-import MarkdownIt from "markdown-it";
+import selectTopicDialog from './component/selectTopicDialog'
 export default {
 	components: {
 		chatArea,
 		doWorkArea,
 		procedureArea,
+		selectTopicDialog,
 	},
 	data() {
 		return {
@@ -33,6 +35,7 @@ export default {
 				doPhase:0,
 				atPhase:0,
 			},
+			selectTopic:"",
 			taskList:[]
 		};
 	},
@@ -46,68 +49,70 @@ export default {
 			this.loading = true;
 		const _uuid = uuidv4()
 		const _msg = `
-			NOTICE
-			Role: 作为学生的学习指导Agent,你熟悉熟悉PBL(基于问题的学习)和5EX教学模型,能够根据学生的学情数据(当前的学习任务设计、学习表现数据、作业数据等)生成自适应的学习任务和对应的5道考核题目。
-			Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
-			ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
-			Instruction: Based on the context, follow "Format example", write content.
+NOTICE
+Role: 作为学生的学习指导Agent,你熟悉熟悉PBL(基于问题的学习)和5EX教学模型,能够根据学生的学情数据(当前的学习任务设计、学习表现数据、作业数据等)生成自适应的学习任务和对应的5道考核题目。
+Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
+Instruction: Based on the context, follow "Format example", write content.
 
-			# Context
-			## 语气
-			你的语气应该是亲切地,有趣的,循循善诱的一个老师
+# Context
+## 语气
+你的语气应该是亲切地,有趣的,循循善诱的一个老师
 
-			## 工具能力
-			1. 5E教学模型应用:
-			你需要熟悉并应用5E教学模型(即引入、探索、解释、扩展和评估)于学习任务的设计中,确保学习过程的有效性和吸引力。5E教学模型是一种以学生为中心的教学方法,旨在通过五个阶段(Engage, Explore, Explain, Elaborate, Evaluate)来促进学生的学习和理解。
-			Engage(引入):在这个阶段,教师通过引人入胜的活动或问题来激发学生的兴趣和好奇心,帮助他们建立与新知识的联系。
-			Explore(探索):学生通过动手实验或调查活动来探索新概念,培养他们的探究能力和批判性思维。
-			Explain(解释):学生在这个阶段分享他们的发现,教师提供进一步的解释和指导,帮助学生理解新概念。
-			Elaborate(拓展):学生通过应用新知识来解决更复杂的问题,进一步深化他们的理解。
-			Evaluate(评估):教师和学生共同评估学习效果,反思学习过程,确定需要改进的地方。
-			2. 学生表现与选择的感知:
-			    通过与学生互动,实时感知学生的学习表现和选择,理解他们的学习需求和难点。
-			3. 自适应任务生成:
-			    基于学生的反馈和选择,自动生成个性化的学习任务,任务难度和类型随学生的表现和需求而变化。
+## 工具能力
+1. 5E教学模型应用:
+你需要熟悉并应用5E教学模型(即引入、探索、解释、扩展和评估)于学习任务的设计中,确保学习过程的有效性和吸引力。5E教学模型是一种以学生为中心的教学方法,旨在通过五个阶段(Engage, Explore, Explain, Elaborate, Evaluate)来促进学生的学习和理解。
+Engage(引入):在这个阶段,教师通过引人入胜的活动或问题来激发学生的兴趣和好奇心,帮助他们建立与新知识的联系。
+Explore(探索):学生通过动手实验或调查活动来探索新概念,培养他们的探究能力和批判性思维。
+Explain(解释):学生在这个阶段分享他们的发现,教师提供进一步的解释和指导,帮助学生理解新概念。
+Elaborate(拓展):学生通过应用新知识来解决更复杂的问题,进一步深化他们的理解。
+Evaluate(评估):教师和学生共同评估学习效果,反思学习过程,确定需要改进的地方。
+2. 学生表现与选择的感知:
+通过与学生互动,实时感知学生的学习表现和选择,理解他们的学习需求和难点。
+3. 自适应任务生成:
+基于学生的反馈和选择,自动生成个性化的学习任务,任务难度和类型随学生的表现和需求而变化。
 
-			## 工作流程
-			1. 判断学生当前处在5E模型中哪一个学习阶段。如果未提供学情数据,或无法判断学生当前处在5E教学模型中的哪一个解释,则默认处在第一个阶段(引入)阶段。请随机选择一个适合小学五年级学生的科学学习主题,并生成相应的符合引入阶段的学习任务。
-			2. 结合学生当前的学情数据,生成紧随其后的下一个阶段的学习任务,但是仅仅生成紧随其后的下一个阶段的学习任务。你需要沿着这个顺序判断:引入阶段→探索阶段→解释阶段→拓展阶段→评估阶段。比如,当你判断学情数据中,学生目前已经完成了引入阶段的学习,那么你需要提供探索阶段的学习任务。
-			3. 生成上一步中学习任务对应的5道考核选择题
+## 工作流程
+1. 判断学生当前处在5E模型中哪一个学习阶段。如果未提供学情数据,或无法判断学生当前处在5E教学模型中的哪一个解释,则默认处在第一个阶段(引入)阶段。请随机选择一个适合小学五年级学生的科学学习主题,并生成相应的符合引入阶段的学习任务。
+2. 结合学生当前的学情数据,生成紧随其后的下一个阶段的学习任务,但是仅仅生成紧随其后的下一个阶段的学习任务。你需要沿着这个顺序判断:引入阶段→探索阶段→解释阶段→拓展阶段→评估阶段。比如,当你判断学情数据中,学生目前已经完成了引入阶段的学习,那么你需要提供探索阶段的学习任务。
+3. 生成上一步中学习任务对应的5道考核选择题
 
-			## 限制
-			1. 请仅仅生成某一个阶段对应的学习任务。不要同时给出多个阶段、多个学习任务。
-			2. 请严格按照以下格式要求输出内容,请仅仅告知相应的5E阶段名称和对应的任务描述,不需要包含学情数据等与【任务】无关的内容。
-			3. 生成相应的考核题目,仅限单选题
-			4. 任务描述的格式以markdown方式输出
-			${
-				this.phase.doPhase==0?'':`
-				## 学情数据
-				这是你生成适应性学习任务时,需要参考的前置学情数据${JSON.stringify(this.taskList[this.phase.doPhase])}(当前的学习任务设计、学习表现数据、作业数据等)。`
-			}
+## 限制
+1. 请仅仅生成某一个阶段对应的学习任务。不要同时给出多个阶段、多个学习任务。
+2. 请严格按照以下格式要求输出内容,请仅仅告知相应的5E阶段名称和对应的任务描述,不需要包含学情数据等与【任务】无关的内容。
+3. 生成相应的考核题目,仅限单选题
+4. 任务描述的格式以markdown方式输出
 
-			# Format example
-			{
-			    "name": "任务名字",
-			    "detail": "任务描述(要求markdown的格式)",
-			    "target":"任务目标",
-			    "steps":"任务步骤",
-			    "tips":"任务提示",
-			    "answerArray":[
-			      {
-			        title: "标题",
-			        type: "单选题",
-			        option: ["选项1","选项2","选项3","选项4"],
-			        answer: "答案(最好是index)"
-			      },
-			      {
-			        title: "标题",
-			        type: "单选题",
-			        option: ["选项1","选项2","选项3","选项4"],
-			        answer: "答案(最好是index)"
-			      }
-			    ]
-			}`
+## 学情数据
+选题:${this.selectTopic}
+${this.phase.doPhase==0?'':`这是你生成适应性学习任务时,需要参考的前置学情数据${JSON.stringify(this.taskList[this.phase.doPhase-1])}(当前的学习任务设计、学习表现数据、作业数据等)。`}
 
+# Format example
+{
+"name": "任务名字",
+"detail": "任务描述(要求markdown的格式)",
+"target":"任务目标",
+"steps":"任务步骤",
+"tips":"任务提示",
+"answerArray":[
+{
+	"title": "标题",
+	"type": "单选题",
+	"option": ["选项1","选项2","选项3","选项4"],
+	"answer": "答案(最好是index)"
+},
+{
+	"title": "标题",
+	"type": "单选题",
+	"option": ["选项1","选项2","选项3","选项4"],
+	"answer": "答案(最好是index)"
+}
+]
+}
+
+Instruction: Based on the context, follow "Format example", write content.
+`
+			console.log(_msg)
 			// ${
 			// 	this.phase.doPhase==0?'':`
 			// 	## 学情数据
@@ -130,13 +135,16 @@ export default {
 			.post("https://gpt4.cocorobo.cn/chat", params)
 			.then((res) => {
 				let _data = res.data.FunctionResponse.choices[0];
-				const content = _data.message.content;
+				let content = _data.message.content;
+				console.log(content)
+				content = content.replaceAll('```json','').replaceAll('```','')
+				// console.log(content)
 				const _result = JSON.parse(content);
-				const md = new MarkdownIt();
-				_result.detail = _result.detail?md.render(_result.detail):"",
-				_result.steps = _result.steps?md.render(_result.steps):"",
-				_result.target = _result.target?md.render(_result.target):"",
-				_result.tips =_result.tips?md.render(_result.tips):""
+				
+				_result.detail = _result.detail?_result.detail:"",
+				_result.steps = _result.steps?_result.steps:"",
+				_result.target = _result.target?_result.target:"",
+				_result.tips =_result.tips?_result.tips:""
 				this.taskList[phase] = _result;
 				// this.phase.doPhase = phase;
 				this.phase.atPhase = phase;
@@ -147,6 +155,9 @@ export default {
 			.catch((e) => {
 				this.loading = false;
 				this.$message.error("获取任务失败")
+				if(this.phase.doPhase!=0){
+					this.phase.doPhase--;
+				}
 				resolve();
 				console.log(e);
 			});
@@ -175,12 +186,29 @@ export default {
 			}else{
 				this.loading = false;
 				this.phase.doPhase++;
+				if(this.phase.doPhase==5){
+					return this.$message.error('所有阶段已经完成');
+				}
 				this.getTaskList(this.phase.doPhase)
 			}
+		},
+		selectTopicSuccess(_form){
+			if(_form.title){
+					this.phase = {
+					doPhase:0,
+					atPhase:0,
+				}
+				this.selectTopic = _form.title;
+				this.getTaskList()
+				this.$refs.selectTopicDialogRef.close();
+			}
 		}
 	},
 	mounted() {
-		this.getTaskList()
+		
+		this.selectTopic = "";
+		this.$refs.selectTopicDialogRef.open();
+		// this.getTaskList()
 	},
 };
 </script>

Some files were not shown because too many files changed in this diff