lsc 7 months ago
parent
commit
254ab2677b

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.c27d3f1477f2ea059d35cc06a6143c18.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.ee476e38463461edca63.js></script><script type=text/javascript src=./static/js/app.dca88a2e8602212c6a79.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.d8ba2f85a90610798ec343ae68b5d756.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.ee476e38463461edca63.js></script><script type=text/javascript src=./static/js/app.7544afcbfc259141db46.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.d8ba2f85a90610798ec343ae68b5d756.css


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


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


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


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


+ 226 - 17
src/components/pages/aiAddCourse/addCourse.vue

@@ -4714,11 +4714,18 @@
                                 margin: 20px 0;
                               ">
                               <div class="lineTitle clineTitle">评价设置</div>
-                              <el-tooltip effect="light" content="右键单击可配置提示词" placement="bottom">
-                                <div class="r_pub_button_op" style="margin-left:auto;"
-                                  @contextmenu.prevent="openAiDialog(1, 'aiDetail4', itemTask.eList, itemTaskIndex)"
-                                  @click="openAiDialog(2, 'aiDetail4', itemTask.eList, itemTaskIndex)">智能优化</div>
-                              </el-tooltip>
+                              <div style="margin-left:auto;display: flex;">
+                                <el-tooltip effect="light" content="右键单击可配置提示词" placement="bottom">
+                                  <div class="r_pub_button_op"
+                                    @contextmenu.prevent="openAiDialog(1, 'aiRateRuleA', itemTaskIndex)"
+                                    @click="openAiDialog(2, 'aiRateRuleA', itemTaskIndex)">一键生成评价细则</div>
+                                </el-tooltip>
+                                <el-tooltip effect="light" content="右键单击可配置提示词" placement="bottom">
+                                  <div class="r_pub_button_op" style="margin-left:10px;"
+                                    @contextmenu.prevent="openAiDialog(1, 'aiDetail4', itemTask.eList, itemTaskIndex)"
+                                    @click="openAiDialog(2, 'aiDetail4', itemTask.eList, itemTaskIndex)">智能优化</div>
+                                </el-tooltip>
+                              </div>
                               <!-- <div class="line" style="width: 90%"></div> -->
                             </div>
                           </div>
@@ -4776,6 +4783,26 @@
                                     <el-cascader :options="targetArray" v-model="itemTask.eList[eIndex].target"
                                       :props="{ checkStrictly: true }" :show-all-levels="false" clearable></el-cascader>
                                   </div>
+                                  <div class="elist_inptu_text" style="align-items: flex-start;" v-loading="ruleLoading[itemTaskIndex] && ruleLoading[itemTaskIndex][eIndex]" element-loading-text="小可正在努力生成中,请稍等...">
+                                    <span>细则:</span>
+                                    <div style="width: calc(100%);">
+                                      <div @click="openRule(itemTaskIndex, eIndex)" class="ruleBtn">{{itemTask.eList[eIndex].isrule ? '收起细则' : '展开细则'}}</div>
+                                      <div style="width: calc(100%);" class='op_task_box' v-if="itemTask.eList[eIndex].isrule">
+                                        <textarea v-autoHeight="68" rows="2" class="binfo_input binfo_textarea" cols v-model="itemTask.eList[eIndex].rule" placeholder="请输入评价细则"></textarea>    
+                                          <div class="op_box">
+                                            <div class="op_remark"></div>
+                                            <div style="display: flex;">
+                                              <el-tooltip effect="light" content="右键单击可配置提示词" placement="bottom">
+                                                <div class="r_pub_button_op"
+                                                  @contextmenu.prevent="openAiDialog(1, 'aiRateRule', itemTaskIndex, eIndex)"
+                                                  @click="openAiDialog(2, 'aiRateRule', itemTaskIndex, eIndex)">{{itemTask.eList[eIndex].rule ? '重新生成' : '生成细则'}}</div>
+                                              </el-tooltip>
+                                            </div>
+                                          </div>
+                                      </div>
+                                    </div>
+                                    
+                                  </div>
                                 </div>
                               </div>
                               <!-- <div class="addToolFun" @click="addEList(unitIndex, itemTaskIndex)"
@@ -4987,6 +5014,7 @@
         <aiTips ttitle="任务详情" title="任务描述优化" :detail="aiJson.aiDetail2" pan="aiDetail2" @setAiJson="setAiJson" />
         <aiTips ttitle="任务详情" title="工具描述优化" :detail="aiJson.aiDetail3" pan="aiDetail3" @setAiJson="setAiJson" />
         <aiTips ttitle="任务详情" title="任务评价优化" :detail="aiJson.aiDetail4" pan="aiDetail4" @setAiJson="setAiJson" />
+        <!-- <aiTips ttitle="任务详情" title="生成评价细则" :detail="aiJson.aiRateRule" pan="aiRateRule" @setAiJson="setAiJson" /> -->
       </div>
     </div>
     <el-dialog title="提示" :visible.sync="dialogVisible" :append-to-body="true" width="25%" :before-close="handleClose"
@@ -6813,6 +6841,7 @@ export default {
       // yiKeTemplateArray:['cf5722a4-401b-11ef-b873-005056b86db5','cf5722a4-401b-11ef-b873-005056b86dc4','cf5722a4-401b-11ef-b873-005056b86dc3','cf5722a4-401b-11ef-b873-005056b86dc5','9dd4bb76-1e48-11ef-bee5-005056b86dc4'],
       yiKeTemplateArray:[],
       taskLoading: [],
+      ruleLoading: [],
     };
   },
   directives: {
@@ -7381,6 +7410,21 @@ export default {
         type: "warning",
       })
         .then(() => {
+          if (this.taskLoading.length) {
+            let _pan = 1
+            for(var k = 0; k < this.taskLoading.length; k++){
+              if(this.taskLoading[k]){
+                this.$message({
+                  message: `请等待任务${k+1}回答完毕后再保存`,
+                  type: "warning"
+                });
+                _pan = 2
+              }
+            }
+            if(_pan == 2){
+              return
+            }
+          }
           if (this.cid == "" || this.cid == undefined) {
             if (this.courseName == "") {
               this.$message.error("请补充填写课程名称");
@@ -7695,6 +7739,21 @@ export default {
           return;
         }
       } else if (this.steps == 3) {
+        if (this.taskLoading.length) {
+          let _pan = 1
+          for(var k = 0; k < this.taskLoading.length; k++){
+            if(this.taskLoading[k]){
+              this.$message({
+                message: `请等待任务${k+1}回答完毕后再上传`,
+                type: "warning"
+              });
+              _pan = 2
+            }
+          }
+          if(_pan == 2){
+            return
+          }
+        }
         if (this.cid == "" || this.cid == undefined) {
           if (this.courseName == "") {
             this.$message.error("请补充填写课程名称");
@@ -10786,6 +10845,7 @@ export default {
             this.aiJson.aiSearchFile = this.aiJson.aiSearchFile ? this.aiJson.aiSearchFile : '请根据<关键词>,从你的相应知识库去检索5个最相关的信息。'
             this.aiJson.aiTarget2 = this.aiJson.aiTarget2 ? this.aiJson.aiTarget2 : '请根据课程标题<课程标题>,从你的知识库去检索5个最相关的信息'
             this.aiJson.aiOutlineDetail2 = this.aiJson.aiOutlineDetail2 ? this.aiJson.aiOutlineDetail2 : '请参考#参考资料,重新生成该任务,生成内容需包含任务名,任务设计,评价标准。注意,你绝对不能重复已有其他任务,也不要输出其他内容'
+            this.aiJson.aiRateRule = '根据<评价维度>和<维度描述>,制定具体的评价细则。 具体的评价细则分为6级——0星,1星,2星,3星,4星,5星。'
             if(this.templateid == '61c628b9-3d96-11ef-b873-005056b86db5'){
               this.aiJson.aiOutlineTask = this.aiJson.aiOutlineTask ? this.aiJson.aiOutlineTask : '请根据<课程名字>以及该课程的<课程简要描述>来为该课程生成100字以内的序列课程任务,序列任务要求彼此连结紧密且没有重复。'
               this.aiJson.aiOutlineDetail = this.aiJson.aiOutlineDetail ? this.aiJson.aiOutlineDetail : '参考<课程名字>、<任务名>和<课程简要描述>的内容,为该序列生成任务详情。任务详情中需要包含教学目标,任务设计和评价标准。'
@@ -12771,6 +12831,7 @@ export default {
                 this.aiJson.aiSearchFile = this.aiJson.aiSearchFile ? this.aiJson.aiSearchFile : '请根据<关键词>,从你的相应知识库去检索5个最相关的信息。'
                 this.aiJson.aiTarget2 = this.aiJson.aiTarget2 ? this.aiJson.aiTarget2 : '请根据课程标题<课程标题>,从你的知识库去检索5个最相关的信息'
                 this.aiJson.aiOutlineDetail2 = this.aiJson.aiOutlineDetail2 ? this.aiJson.aiOutlineDetail2 : '请参考#参考资料,重新生成该任务,生成内容需包含任务名,任务设计,评价标准。注意,你绝对不能重复已有其他任务,也不要输出其他内容'
+                this.aiJson.aiRateRule = '根据<评价维度>和<维度描述>,制定具体的评价细则。 具体的评价细则分为6级——0星,1星,2星,3星,4星,5星。'
                 if(this.templateid == '61c628b9-3d96-11ef-b873-005056b86db5'){
                   this.aiJson.aiOutlineTask = this.aiJson.aiOutlineTask ? this.aiJson.aiOutlineTask : '请根据<课程名字>以及该课程的<课程简要描述>来为该课程生成100字以内的序列课程任务,序列任务要求彼此连结紧密且没有重复。'
                   this.aiJson.aiOutlineDetail = this.aiJson.aiOutlineDetail ? this.aiJson.aiOutlineDetail : '参考<课程名字>、<任务名>和<课程简要描述>的内容,为该序列生成任务详情。任务详情中需要包含教学目标,任务设计和评价标准。'
@@ -12908,6 +12969,7 @@ export default {
                 this.aiJson.aiSearchFile = this.aiJson.aiSearchFile ? this.aiJson.aiSearchFile : '请根据<关键词>,从你的相应知识库去检索5个最相关的信息。'
                 this.aiJson.aiTarget2 = this.aiJson.aiTarget2 ? this.aiJson.aiTarget2 : '请根据课程标题<课程标题>,从你的知识库去检索5个最相关的信息'
                 this.aiJson.aiOutlineDetail2 = this.aiJson.aiOutlineDetail2 ? this.aiJson.aiOutlineDetail2 : '请参考#参考资料,重新生成该任务,生成内容需包含任务名,任务设计,评价标准。注意,你绝对不能重复已有其他任务,也不要输出其他内容'
+                this.aiJson.aiRateRule = '根据<评价维度>和<维度描述>,制定具体的评价细则。 具体的评价细则分为6级——0星,1星,2星,3星,4星,5星。'
                 if(this.templateid == '61c628b9-3d96-11ef-b873-005056b86db5'){
                   this.aiJson.aiOutlineTask = this.aiJson.aiOutlineTask ? this.aiJson.aiOutlineTask : '请根据<课程名字>以及该课程的<课程简要描述>来为该课程生成100字以内的序列课程任务,序列任务要求彼此连结紧密且没有重复。'
                   this.aiJson.aiOutlineDetail = this.aiJson.aiOutlineDetail ? this.aiJson.aiOutlineDetail : '参考<课程名字>、<任务名>和<课程简要描述>的内容,为该序列生成任务详情。任务详情中需要包含教学目标,任务设计和评价标准。'
@@ -14845,6 +14907,8 @@ export default {
     setAiJson(pan,string,string2){
       if(pan == 'aiTeacher2'){
         this.aiJson['teacherDetail2'] = string
+      }else if(pan == 'aiRateRuleA'){
+        this.aiJson['aiRateRule'] = string
       }else if(pan == 'aiOutline2'){
         this.aiJson['aiOutlineTask'] = string
         this.aiJson['aiOutlineDetail'] = string2
@@ -14876,6 +14940,14 @@ export default {
       }
       this.$forceUpdate();
     },
+    openRule(i, k){
+      if(this.unitJson[0].chapterInfo[0].taskJson[i].eList[k].isrule){
+        this.unitJson[0].chapterInfo[0].taskJson[i].eList[k].isrule = false
+      }else {
+        this.unitJson[0].chapterInfo[0].taskJson[i].eList[k].isrule = true
+      }
+      this.$forceUpdate();
+    },
     editCpote(index){
       if(this.cpote[index]){
         this.cpote[index] = false
@@ -15199,8 +15271,27 @@ export default {
 
         this.aitype = type
         this.aiText = this.aiJson.aiSearchFile
+      } else if (type == 'aiRateRule'){
+        this.aitype = type
+        this.aiText = this.aiJson.aiRateRule
+        this.aiCallback = [callback, index]
+      } else if (type == 'aiRateRuleA'){
+        this.$confirm("是否确定一键生成所有细则", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+          .then(() => {
+            this.aitype = type
+            this.aiText = this.aiJson.aiRateRule
+            this.aiCallback = callback
+            this.dialogVisibleAiD = true
+        }).catch(() => {})
+      }
+
+      if(type != 'aiRateRuleA'){
+        this.dialogVisibleAiD = true
       }
-      this.dialogVisibleAiD = true
     },
     async aiConfirm(msg,msg2) {
       let sub = []
@@ -15496,6 +15587,17 @@ ${msg}。相关信息内容至少要有300tokens,可以是markdown格式
         this.aiSearchFile(messages,()=>{
           this.fileSLoading = false
         })
+      } else if (this.aitype == 'aiRateRule'){
+        this.againEva(msg, this.aiCallback[0], this.aiCallback[1])
+      } else if (this.aitype == 'aiRateRuleA'){
+        for(var i = 0; i < this.unitJson[0].chapterInfo[0].taskJson.length; i++){
+          let task = this.unitJson[0].chapterInfo[0].taskJson[i]
+          for(var k = 0; k < task.eList.length; k++){
+            if(!task.eList[k].rule){
+              this.againEva(msg, i, k)
+            }
+          }
+        }
       }
       this.setAiJson(this.aitype, msg, msg2)
     },
@@ -16981,7 +17083,6 @@ ${this.courseText && this.aiCallback == 2 ? '注意,优化原有的<参考内
               let _task = tArray
               _this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail = _task.detail
               _this.unitJson[0].chapterInfo[0].taskJson[index].eList = _task.elist
-              _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose = []
               _this.unitJson[0].chapterInfo[0].taskJson[index].chapterData = []
               if(!_task.toolChoose || (_task.detail && _task.detail.length < 20) || !_task.detail){
                 console.log("error_________________JSON不对重新生成");
@@ -16989,25 +17090,31 @@ ${this.courseText && this.aiCallback == 2 ? '注意,优化原有的<参考内
                 _this.aiGet32(messages, index)
                 return;
               }
+              _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose = []
               if (_task.toolChoose && _task.toolChoose.length) {
                 for (var j = 0; j < _task.toolChoose.length; j++) {
                   let _json = {
-                      tool: toolsJson[_task.toolChoose[j].tool] ? [toolsJson[_task.toolChoose[j].tool].tool] : [16],
-                      toolDetail: _task.toolChoose[j].detail,
-                      toolType: toolsJson[_task.toolChoose[j].tool] ? toolsJson[_task.toolChoose[j].tool].type : 2,
-                      askCount: 1,
-                      askTitle: "",
-                      askJson: [{ askstitle: "", askItem: 1, checkList: [] }],
-                    }
+                    tool: [],
+                    toolDetail: _task.toolChoose[j].detail,
+                    toolType: toolsJson[_task.toolChoose[j].tool] ? toolsJson[_task.toolChoose[j].tool].type : 2,
+                    askCount: 1,
+                    askTitle: "",
+                    askJson: [{ askstitle: "", askItem: 1, checkList: [] }],
+                  }
+                  _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose.push(_json)
                   
                   if(converter(_task.toolChoose[j].tool) == converter('问答')){
                     let answerQ = await _this.aiCreateQuestion(15, index)
-                    _json.answerQ = answerQ.answerQ 
+                    // _json.answerQ = answerQ.answerQ 
+                    _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose[_this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose.length - 1].answerQ = answerQ.answerQ 
                   }else if(converter(_task.toolChoose[j].tool) == converter('选择题')){
                     let testJson = await _this.aiCreateQuestion(45, index)
-                    _json.testJson = {"testCount":testJson.length,"testTitle":"","testJson":testJson} 
+                    // _json.testJson = {"testCount":testJson.length,"testTitle":"","testJson":testJson} 
+                    _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose[_this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose.length - 1].testJson = {"testCount":testJson.length,"testTitle":"","testJson":testJson} 
                   }
-                  _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose.push(_json)
+                  _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose[_this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose.length - 1].tool = toolsJson[_task.toolChoose[j].tool] ? [toolsJson[_task.toolChoose[j].tool].tool] : [16] 
+                  _this.$forceUpdate();
+                  // _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose.push(_json)
                 }
               } else {
                 _this.unitJson[0].chapterInfo[0].taskJson[index].toolChoose.push(
@@ -19543,6 +19650,101 @@ ${this.targetCourseText && this.aiCallback == 2 ? '注意,优化原有的<参
         // this.$forceUpdate();
       };
     },
+    againEva(msg, i, k) {
+      if(!this.unitJson[0].chapterInfo[0].taskJson[i].eList[k].value || !this.unitJson[0].chapterInfo[0].taskJson[i].eList[k].detail){
+        this.$message.error(`任务${i+1}的第${k+1}个评价完善信息后再生成细则`)
+        return;
+      }
+      if (this.ruleLoading[i]) {
+        this.ruleLoading[i][k] = true
+      } else {
+        this.ruleLoading[i] = []
+        this.ruleLoading[i][k] = true
+      }
+      let message = `NOTICE
+Role: 你是一个专业的项目式学习导师,你要根据<评价维度>和<维度描述>制定具体的评价细则。
+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
+##要求
+${msg}
+
+##制定标准资料
+评价维度:${this.unitJson[0].chapterInfo[0].taskJson[i].eList[k].value}
+维度描述:${this.unitJson[0].chapterInfo[0].taskJson[i].eList[k].detail}
+
+# Format example
+== 0 星,作业内容与作业要求无关;
+1 星,没有识别问题和需求;
+2 星,问题或需求没有被清晰理解或准确识别;
+3 星,问题或需求的一部分被识别;
+4 星,问题或需求的大部分被识别;
+5 星,问题或需求都被识别。 ==
+
+ `
+      let params = {
+        // "model": "Chat",
+        model: "gpt-4o",
+        temperature: 0,
+        max_tokens: 4096,
+        top_p: 1,
+        frequency_penalty: 0,
+        presence_penalty: 0,
+        messages: [
+          {
+            content: message.replaceAll("\n", " ").replaceAll("*", ""),
+            role: "user"
+          }
+        ],
+        stream: false,
+        uid: this.userid,
+        mind_map_question: ""
+      };
+
+      this.ajax
+        .post("https://gpt4.cocorobo.cn/chat", params)
+        .then(response => {
+          let data = response.data.FunctionResponse;
+          console.log("data", data);
+          if (data.choices && data.choices.length && data.choices[0].message) {
+            let content = data.choices[0].message.content;
+
+            var regex = new RegExp('==([^=]+)==');
+            let match = content.match(regex);
+            if (match) {
+              content = match[1].trim().replaceAll(' ', '');
+              // 获取匹配到的内容并去除两端空格 
+              console.log('contentInsideDoubleEquals', content);
+              if (content.indexOf('0星') == -1 || content.indexOf('2星') == -1 || content.indexOf('3星') == -1 || content.indexOf('4星') == -1 || content.indexOf('5星') == -1) {
+                console.log("未有星级。");
+                this.againEva(msg, i, k)
+                return
+              }
+              //  return 
+            } else {
+              console.log("未找到匹配的内容。");
+              this.againEva(msg, i, k)
+              return
+            }
+
+            let elist = JSON.parse(JSON.stringify(this.unitJson[0].chapterInfo[0].taskJson[i].eList[k]))
+            // this.unitJson[0].chapterInfo[0].taskJson[i].eList[k].rule=JSON.parse(JSON.stringify(content.replaceAll("#", "")))
+            elist.rule = JSON.parse(JSON.stringify(content.replaceAll("#", "")))
+            this.$set(this.unitJson[0].chapterInfo[0].taskJson[i].eList, k, elist)
+            this.$forceUpdate();
+            this.ruleLoading[i][k] = false
+
+          }else{
+            this.ruleLoading[i][k] = false
+          }
+        })
+        .catch(error => {
+          console.log(error);
+          this.ruleLoading[i][k] = false
+        });
+    },
     async aiSearchFile(messages, callback) {
       let _this = this
 
@@ -24082,4 +24284,11 @@ ol {
 .chapter_upload_check.checked{
   background-image: url('../../../assets/icon/checked.png');
 }
+
+.ruleBtn {
+  height: 36px;
+  line-height: 36px;
+  cursor: pointer;
+  color: #0061FF;
+}
 </style>

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