Explorar o código

Merge branch 'beta' into HK

lsc hai 10 meses
pai
achega
5d07d38c28

+ 4 - 0
dist/index.html

@@ -32,7 +32,11 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
+<<<<<<< HEAD
     }</style><link href=./static/css/app.14ef1617f3a3101308cd8eee876dde02.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.0ad6c5648a38a6d1fa8f.js></script><script type=text/javascript src=./static/js/vendor.a82b79982b082928b294.js></script><script type=text/javascript src=./static/js/app.99d0e8dbbacb6a7ec345.js></script></body></html><script>function stopSafari() {
+=======
+    }</style><link href=./static/css/app.acc3f4ca6d20b29571fd60acf4e1a76e.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.00bfcafc8431113801f1.js></script><script type=text/javascript src=./static/js/vendor.a54a39a7efbf3fedeee2.js></script><script type=text/javascript src=./static/js/app.af71ded20783c519d2b0.js></script></body></html><script>function stopSafari() {
+>>>>>>> beta
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
dist/static/css/app.14ef1617f3a3101308cd8eee876dde02.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/app.14ef1617f3a3101308cd8eee876dde02.css.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
dist/static/css/app.acc3f4ca6d20b29571fd60acf4e1a76e.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
dist/static/css/app.acc3f4ca6d20b29571fd60acf4e1a76e.css.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
dist/static/js/app.99d0e8dbbacb6a7ec345.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/app.99d0e8dbbacb6a7ec345.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
dist/static/js/app.af71ded20783c519d2b0.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
dist/static/js/app.af71ded20783c519d2b0.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/manifest.0ad6c5648a38a6d1fa8f.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 186 - 104
src/components/pages/aiAddCourse/addCourse.vue


+ 45 - 14
src/components/pages/aiAddCourse/aiBoxRight.vue

@@ -167,7 +167,13 @@ import checkIsImg from "../../../assets/icon/sourceFile/check_is.png";
 import { v4 as uuidv4 } from "uuid";
 import MarkdownIt from "markdown-it";
 import TurndownService from 'turndown';
+import { number } from 'echarts';
 
+const OpenCC = require("opencc-js");
+let converter = OpenCC.Converter({
+  from: "cn",
+  to: "hk"
+});
 
 export default {
   props: {
@@ -206,6 +212,10 @@ export default {
         return {};
       }
     },
+    languageSetting: {
+      type: Number,
+      default: 0
+    }
   },
   data() {
     return {
@@ -388,6 +398,17 @@ export default {
     },
   },
   methods: {
+    getLang(){
+      let lang = ''
+      if(this.languageSetting == 0){
+        lang = 'Chinese.'
+      }else if(this.languageSetting == 1){
+        lang = 'Traditional Chinese.'
+      }else if(this.languageSetting == 2){
+        lang = 'English.'
+      }
+      return lang
+    },
     cancelJ(string) {
       this.$emit('setIsQuote', string)
     },
@@ -523,7 +544,6 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully reference
           `;
           message = msg;
         }
-
         // 这里处理@的角色
         let _atRoleList = [];
         let _roleList = [...this.roleList, ...this.publicRoleList];
@@ -535,7 +555,10 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully reference
         this.faloading = true;
         if (_atRoleList.length > 0) {
           //有@角色
-          let _replaceText = message;
+          let _replaceText = `Language: ${this.getLang()}
+            Language: ${this.getLang()}
+            Language: ${this.getLang()}
+            ${message}`;
           let _htmlText = message;
           _atRoleList.forEach(_i => {
             _replaceText = _replaceText.replaceAll(`@${_i.assistantName}`, ``);
@@ -591,13 +614,10 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully reference
               session_name: `${this.courseId}-addCourseA`,
               uid: _uid,
               file_ids: [],
-              model: "gpt-4o-2024-08-06"
+              // model: "gpt-4o-2024-08-06"
+              model: "qwen-plus",
             };
-            var OpenCC = require("opencc-js");
-            let converter = OpenCC.Converter({
-              from: "cn",
-              to: "hk"
-            });
+
 
             this.ajax
               .post("https://gpt4.cocorobo.cn/ai_agent_park_chat_new", params)
@@ -641,9 +661,17 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully reference
               if (i.aiContent)
                 history.push({ role: "assistant", content: i.aiContent });
             });
+          }else{
+            history.push({ role: "user", content: message });
           }
-
-          history.push({ role: "user", content: message });
+          history = history.filter(i => i.content != "您好,我是您的创课助手小可,在创课中遇到什么问题,都可以与我对话~,我会尽量帮助您的")
+          
+          history = history.map(i => (
+            { role: i.role, 
+              content: `Language: ${this.getLang()}
+            Language: ${this.getLang()}
+            Language: ${this.getLang()}
+            ${i.content}` }))
           this.$nextTick(() => {
             this.$refs.chatDialog.scrollTop = this.$refs.chatDialog.scrollHeight;
           });
@@ -665,10 +693,13 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully reference
           this.ajax
             .post("https://gpt4.cocorobo.cn/chat", params)
             .then(res => {
-              if (res.data.FunctionResponse.result == "发送成功") {
-              } else {
-                this.$message.warning(res.data.FunctionResponse.result);
-              }
+              if (
+                  converter(res.data.FunctionResponse.result) ==
+                  converter("发送成功")
+                ) {
+                } else {
+                  this.$message.warning(res.data.FunctionResponse.result);
+                }
             })
             .catch(e => {
               console.log(e);

+ 1 - 1
src/components/pages/aiAddCourse/aiCreateVideoDialogCn.vue

@@ -18,7 +18,7 @@
             </div>
             <div class="Box">
                 <div class="video_box video_box2" v-for="(item, index) in data" :key="index">
-                    <!-- <img :src="item.pic" /> -->
+                    <img :src="item.thumbnail.static" />
                     <span class="name" v-html="item.title"></span>
                     <span class="author">作者:{{ item.author }}</span>
                     <span class="detail">{{ item.description }}</span>

+ 24 - 18
src/components/pages/aiAddCourse/evaList.vue

@@ -177,14 +177,14 @@ Language: ${this.getLang()}
 【排序】通过设置卡片内容及正确顺序,用于教师使用排序类题目检查学生对知识的掌握和理解,参考指标为题目的正确率。。
 【选择匹配】通过上传题目图片与设置正确回答,用于教师使用选择匹配(连线)检查学生对知识的掌握和理解,参考指标为题目的正确率。
 
-你要学习上传的文件。文件中包含了该学科的“核心素养”和“课程目标”。“学科核心素养”指学生应具备的,能够适应终身发展和社会发展需要的必备品格和关键能力。“课程目标”指课程本身要实现的具体目标和意图。它规定了某一教育阶段的学生通过课程学习以后,在发展品德、智力、体质等方面期望实现的程度,它是确定课程内容、教学目标和教学方法的基础。你要理解学科核心素养和学科目标之间的关系。你生成的评价标准可以被理解为课程目标。
+你要学习上传的文件。文件中包含了该学科的“核心素养”和“课程目标”。“学科核心素养”指学生应具备的,能够适应终身发展和社会发展需要的必备品格和关键能力。“课程目标”指课程本身要实现的具体目标和意图。它规定了某一教育阶段的学生通过课程学习以后,在发展品德、智力、体质等方面期望实现的程度,它是确定课程内容、教学目标和教学方法的基础。当选择多个学科时,上传的文件中会有《跨学科素养参考资料》,跨学科素养能力指具有跨文化一致性的、能够跨越一系列情境长期存在和发挥作用的、个体用于应对和解决日常工作和生活中遇到的各种复杂挑战和需求的能力;例如“个人社会责任”“任务规划”“自我管理”“承担风险”等。你要理解学科核心素养和学科目标之间的关系。你生成的评价标准可以被理解为课程目标。
 
 #目标#
-你需要完成以下个步骤:
+你需要完成以下个步骤:
 1.你要结合<任务描述:${taskDetail}><工具名称:${tool}>和<工具描述:${toolDetail}>生成适合当前作业的评价标准。评价标准用于评估学生的能力。
-2.你要严格按照上传的文件中的“核心素养”和“课程目标”将评价标准对应到课程目标中,并且用学科核心素养归类。如果没有合适的素养匹配,则输出“暂未检索到,请手动输入!”
-3.你要根据第一步生成的评价标准制定每一条标准的六级评价细则,这个评价细则将用于对学生能力的打分。
-4.你要将前三步生成的内容整理成json格式。
+2.你要严格按照上传的文件中的“核心素养”和“课程目标”将评价标准对应到课程目标中,并且用学科核心素养归类。3.只有当上传的文件包含多个学科的课程标准时,允许你检索《跨学科素养参考资料》。你需要先检索学科的课程标准,如果你判断当前的评价标准无法对应具体学科的核心素养,可以检索《跨学科素养参考资料》,找到最合适的并输出。输出的内容一定要包含“核心素养”和“上传文件对应的学科”。
+4.你要根据第一步生成的评价标准制定每一条标准的六级评价细则,这个评价细则将用于对学生能力的打分。
+5.你要将前四步生成的内容整理成json格式。
 
 #风格#
 专业的教育教学用语,简练易懂,逻辑性强。
@@ -201,9 +201,9 @@ Language: ${this.getLang()}
 3.具体的评价细则分为6级——0星,1星,2星,3星,4星,5星。输出格式参考#评价细则范例#。
 4.参考#json格式范例#,将内容整理成json格式。**之间的内容为json格式中的代码。以*[*开头,以*]*结尾。每一条评价标准、核心素养以及评价细则以*{*开头,以*}*结尾。核心素养前有*"core":*。评价标准前有*"std":*。评价细则前有*"rule":*。具体内容放在""之间。格式如下:
 [
-    {"std":"评价标准","core":"核心素养(学科)","rule":"评价细则"},
-    {"std":"评价标准","core":"核心素养(学科)","rule":"评价细则"},
-    {"std":"评价标准","core":"核心素养(学科)","rule":"评价细则"},
+    {"std":"评价标准","core":"核心素养(识别上传文件对应的学科)","rule":"评价细则"},
+    {"std":"评价标准","core":"核心素养(识别上传文件对应的学科)","rule":"评价细则"},
+    {"std":"评价标准","core":"核心素养(识别上传文件对应的学科)","rule":"评价细则"},
 ]
 5.只输出json格式的内容,其他的不要输出!
 
@@ -226,31 +226,37 @@ Language: ${this.getLang()}
 
 #核心素养输出范例#
 评价标准:学生应该能准确指出光合作用发生的具体部位(叶绿体),并解释叶绿体在光合作用中的重要性。
-这一条标准对应了《义务教育科学课程标准(2022年版)》中“科学观念”这一条核心素养。所以输出内容为:科学观念(识别上传文件对应的学科)。
+这一条标准对应了《义务教育科学课程标准(2022年版)》中“科学观念”这一条核心素养,识别上传文件对应的学科为“科学”。所以输出内容为:科学观念(科学)。
+
+评价标准:学生能够通过文档工具清晰表达小学生活的回忆与未来期望。
+这一条标准对应了《义务教育艺术课程标准(2022年版)》中“艺术表现”这一条核心素养,识别上传文件对应的学科为“艺术”。所以输出内容为:科学观念(艺术)。
+
+评价标准:学生能够在小组讨论中积极表达观点。
+这一条标准对应了《跨学科素养参考资料》中“合作能力”这一条核心素养,识别上传文件对应的学科为“跨学科”。所以输出内容为:合作能力(跨学科)。
 
 #json格式范例#
 [
-    {"std":"学生应该能清晰地解释光合作用的定义,包括植物利用光能将二氧化碳和水转化为葡萄糖和氧气的过程。","core":"科学观念(识别上传文件对应的学科)","rule":"0星,未能解释光合作用的定义,与主题无关。
+    {"std":"学生应该能清晰地解释光合作用的定义,包括植物利用光能将二氧化碳和水转化为葡萄糖和氧气的过程。","core":"科学观念(科学)","rule":"0星,未能解释光合作用的定义,与主题无关。
 1星,尝试解释光合作用但描述与实际过程不符。
 2星,能够识别光合作用的要素之一,如光能、二氧化碳、水、葡萄糖或氧气,但未形成完整的定义。
 3星,能够部分描述光合作用的过程,例如知道植物利用光能进行转化,但未全面涵盖所有成分。
 4星,能够完整描述光合作用的过程,但细节或某些元素略显不足。
 5星,清晰完整地解释了光合作用的定义,包括如何利用光能将二氧化碳和水转化为葡萄糖和氧气的详细过程。
 "},
-    {"std":"学生应该能正确写出光合作用的化学反应式:6CO2 + 6H2O + 光能 → C6H12O6 + 6O2,并理解每个成分的作用。","core":"科学观念(识别上传文件对应的学科)","rule":"0星:未能写出任何相关的内容,完全没有涉及光合作用的化学反应式。
+    {"std":"学生应该能正确写出光合作用的化学反应式:6CO2 + 6H2O + 光能 → C6H12O6 + 6O2,并理解每个成分的作用。","core":"科学观念(科学)","rule":"0星:未能写出任何相关的内容,完全没有涉及光合作用的化学反应式。
 1星:光合作用的化学反应式错误,完全没有正确的化学分子式。
 2星:能够部分写出光合作用的化学反应式,但分子式及其配比有较多错误,未能体现光能的作用。
 3星:基本写出大部分的光合作用化学反应式,但有小部分错误,对于光能的作用未能准确阐述。
 4星:能较完整写出光合作用的化学反应式,整体正确,但对每个成分的具体作用理解不够深入。
 5星:准确无误地写出光合作用的化学反应式,并能清晰、详细地解释每个成分的作用及其在反应中的重要性。
 "},
-    {"std":"学生应该能准确指出光合作用发生的具体部位(叶绿体),并解释叶绿体在光合作用中的重要性。","core":"科学观念(识别上传文件对应的学科)","rule":"
-0星,学生无法指出光合作用发生的部位,与要求完全不符;
-1星,学生对光合作用发生的部位有初步认知,但所指部位错误;
-2星,学生能部分识别光合作用相关的部位,但无法确定叶绿体;
-3星,学生能指出叶绿体,但无法解释其重要性;
-4星,学生能指出叶绿体,并能说明叶绿体在光合作用中的一个重要作用;
-5星,学生准确指出叶绿体,并详细解释其在光合作用中的重要性及其功能
+    {"std":"学生能够通过文档工具清晰表达小学生活的回忆与未来期望。","core":"艺术表现(艺术)","rule":"
+0星,未能使用文档工具表达任何想法。
+1星,尝试使用文档工具但表达不清晰。
+2星,能够部分表达小学生活的回忆或未来期望。
+3星,能够表达小学生活的回忆或未来期望,但不够完整。
+4星,能够完整表达小学生活的回忆与未来期望,但细节略显不足。
+5星,清晰完整地表达了小学生活的回忆与未来期望,细节丰富
 "},
 ]`
             _this.loading = true

+ 3 - 3
src/components/pages/classroomObservation/components/addNewTeacherVoiceprintDialog.vue

@@ -51,7 +51,7 @@
               点击录制
             </div>
 
-						<div class="a_b_b_b_record">
+						<!-- <div class="a_b_b_b_record">
 							<div class="a_b_b_b_r_left">
 								<img src="../../../../assets/icon/classroomObservation/recordLeft.png" alt="">
 								<div>
@@ -71,7 +71,7 @@
 									<span></span>
 								</div>
 							</div>
-						</div>
+						</div> -->
           </div>
         </div>
       </div>
@@ -86,7 +86,7 @@ export default {
     return {
       dialogVisible: false,
       userId: this.$route.query["userid"],
-      status: 1, //0:初始状态   1:录制
+      status: 0, //0:初始状态   1:录制
 			recordData:{
 				time:0,
 				status:0,//0 录制中  1暂停  2结束

+ 13 - 6
src/components/pages/classroomObservation/components/analysisItem.vue

@@ -574,7 +574,7 @@ export default {
             res.forEach((item, index) => {
               if (index == 0) return; //去掉表头
               let _valueItem = item[2] ? item[2] : item[1];
-              let _value = _valueItem.match(/(\d+)/g);
+              let _value = _valueItem.match(/(\d+)/);
               _value = _value ? parseInt(_value[0]) : 0;
               _result.push({
                 value: _value,
@@ -644,7 +644,10 @@ export default {
             res.forEach((item, index) => {
               if (index == 0) return; //去掉表头
               radarData.push({ name: item[0], max: 5 });
-              seriesData.value.push(parseInt(item[1] ? item[1] : 0));
+							let _valueItem = item[1] ? item[1] :"0";
+              let _value = _valueItem.match(/(\d+)/);
+              _value = _value ? parseInt(_value[0]) : 0;
+              seriesData.value.push(_value);
             });
 
             let _option = {
@@ -698,10 +701,11 @@ export default {
             stepList = this.calculateTopValues(res.length - 1);
             res.forEach((item, index) => {
               if (index == 0) return;
+							let _valueItem = item[1] ? item[1] : "0";
+              let _value = _valueItem.match(/(\d+)/);
+              _value = _value ? parseInt(_value[0]) : 0;
               // 求百分比
-              let _value = Math.floor(
-                (parseInt(item[1] ? item[1] : 0) / 5).toFixed(2) * 100
-              );
+              _value = Math.floor((_value / 5).toFixed(2) * 100);
               _data.push({
                 value: _value,
                 name: item[0],
@@ -845,7 +849,10 @@ export default {
 
           // 匹配每个单元格 (th 或 td)
           while ((cellMatch = cellRegex.exec(rowContent)) !== null) {
-            rowData.push(cellMatch[2].trim()); // 将每个单元格的内容添加到当前行的数组中
+						let _text = cellMatch[2].trim();
+						_text = _text.replace(/&[a-zA-Z]+;/g, '');
+						_text = _text.replace(/<\/?[^>]+(>|$)/g, '')
+            rowData.push(_text); // 将每个单元格的内容添加到当前行的数组中
           }
 
           // 如果该行有数据,推送到 _contentTableList 中

+ 6 - 4
src/components/pages/classroomObservation/components/analysisSpecialItem.vue

@@ -320,7 +320,7 @@ export default {
       this.openItem = newValue;
     },
     editBtn(flag = false) {
-      if (!flag) return console.log("不执行获取");
+      // if (!flag) return console.log("不执行获取");
       this.loadNum = 1;
       this.getData(1);
 
@@ -466,6 +466,7 @@ export default {
     getTimeAllocationData(_dataList, type = 0) {
       this.loading = true;
       this.openItem = false;
+			console.log(_dataList)
       let _data = _dataList.reduce(
         (pre, cur) => {
           if (cur.role == "学生") {
@@ -480,13 +481,12 @@ export default {
           { value: 0, name: "学生" }
         ]
       );
-
-			let _dataPercentage = _data
+				console.log(_data)
+			let _dataPercentage = JSON.parse(JSON.stringify(_data))
 			_data.forEach((i, index) => {
 				_dataPercentage[index].percentage = (i.value / _data.reduce((pre, cur) => pre + cur.value, 0) * 100).toFixed(2)+'%'
 			})
 
-			_dataPercentage.forEach(i=>delete i.value)
       if (type == 1) {
         let _msg = `这是某一节课的师生时间占比,请你分析,写出结论,并给出指导建议。请使用3句完整的话,分析并给出建议。 请注意,当老师或学生的时间占比在【40~59%】之间的时候,也认为师生占比约为1:1,各占50%,师生时间占比比较均衡。
 师生时间占比数据:
@@ -544,6 +544,8 @@ export default {
         ]
       };
 
+			console.log(_option)
+
       let _copyData = JSON.parse(JSON.stringify(this.data));
       _copyData.jsonData.eChartData = _option;
       _copyData.json_data = JSON.stringify(_copyData.jsonData);

+ 18 - 9
src/components/pages/classroomObservation/components/messageArea.vue

@@ -453,7 +453,7 @@ export default {
     useTemplate(json) {
       let _result = [];
       json.forEach(i => {
-				if(i.isOtherData)return _result.push(i);
+        if (i.isOtherData) return _result.push(i);
         let _obj = {
           jsonData: i.jsonData,
           type: i.Type,
@@ -792,7 +792,7 @@ export default {
             resolve();
           });
         } else {
-          this.getDefaultData()
+          this.getDefaultData();
         }
       });
       // this.getValueAddedData();
@@ -811,10 +811,19 @@ export default {
             let _data = res.data[0][0];
             if (_data) {
               _data.tips = JSON.parse(_data.tips);
+              _data.tips.forEach(i => {
+                // if (i.jsonData.eChartData) {
+                //   delete i.jsonData.eChartData;
+                // }
+                // if (i.jsonData.RT && i.jsonData.CH) {
+                //   delete i.jsonData.RT;
+                //   delete i.jsonData.CH;
+                // }
+              });
               this.dataList = _data.tips;
             }
             this.loading = false;
-						resolve();
+            resolve();
           });
       });
     },
@@ -1107,12 +1116,12 @@ export default {
           this.$message.error("获取模块分析列表失败");
         });
     },
-    changeAnalysisName(data,type = 0) {
-			if(type==0){
-				this.dialogTagList.find(i => i.value == data.type).name = data.name;
-			}else if(type==1){
-				this.dialogTagList = data;
-			}
+    changeAnalysisName(data, type = 0) {
+      if (type == 0) {
+        this.dialogTagList.find(i => i.value == data.type).name = data.name;
+      } else if (type == 1) {
+        this.dialogTagList = data;
+      }
       this.bmData.jsonData["dialogTagList"] = this.dialogTagList;
       this.saveData(this.bmData).then(res => {
         // this.$message.success("修改名称成功");

+ 281 - 244
src/components/pages/classroomObservation/components/saveTemplateDialog.vue

@@ -1,294 +1,331 @@
 <template>
-	<div>
-		<el-dialog
-			:center="true"
-			:visible.sync="dialogVisible"
-			:close-on-click-modal="false"
-			width="500px"
-			class="bindingFormDialog"
-		>
-			<div class="a-d-top">
-				<div class="a-d-topTit">
-					<div>另存为模板</div>
-				</div>
-				<div class="a-d-t-right">
-					<span @click.stop="close()">×</span>
-				</div>
-			</div>
-			<div class="bfd_box" v-loading="loading" label-position="top">
-				<el-form :model="form" :rules="rules" ref="ruleForm">
-					<div style="display: flex;width: 100%;justify-content: space-between;">
-						<el-form-item label="模板名称" prop="name">
-  				  <el-input v-model="form.name" placeholder="请输入模板名称" style="width: 300px;"></el-input>
-  				</el-form-item>
-					<el-form-item label="所属学科" prop="subject">
-						<el-select v-model="form.subject" placeholder="请选择所属学科" style="width: 300px;">
-  					  <el-option
-  					    v-for="item in subjectList"
-  					    :key="item.value"
-  					    :label="item.label"
-  					    :value="item.value">
-  					  </el-option>
-  					</el-select>
-  				  <!-- <el-input v-model="form.subject" placeholder="请输入所属学科" style="width: 300px;"></el-input> -->
-  				</el-form-item>
-					</div>
-					<el-form-item label="模板简介(40字以内)" prop="brief">
-						<el-input type="textarea" v-model="form.brief" style="width: 100%;" :rows="3" :maxlength="40" resize="none" placeholder="请输入模板简介"></el-input>
-					</el-form-item>
-					<el-form-item label="权限管理" style="display: flex;flex-direction: column;align-items: flex-start;">
-						<div>公开到社区:<el-switch v-model="form.permissions"></el-switch></div>
-					</el-form-item>
-				</el-form>
-			</div>
-			<div class="bfd_bottom" v-loading="loading">
-				<el-button @click="close()">取消</el-button>
-				<el-button type="primary" @click="submitBtn('ruleForm')">保存</el-button>
-			</div>
-		</el-dialog>
-	</div>
+  <div>
+    <el-dialog
+      :center="true"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      width="500px"
+      class="bindingFormDialog"
+    >
+      <div class="a-d-top">
+        <div class="a-d-topTit">
+          <div>另存为模板</div>
+        </div>
+        <div class="a-d-t-right">
+          <span @click.stop="close()">×</span>
+        </div>
+      </div>
+      <div class="bfd_box" v-loading="loading" label-position="top">
+        <el-form :model="form" :rules="rules" ref="ruleForm">
+          <div
+            style="display: flex;width: 100%;justify-content: space-between;"
+          >
+            <el-form-item label="模板名称" prop="name">
+              <el-input
+                v-model="form.name"
+                placeholder="请输入模板名称"
+                style="width: 300px;"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="所属学科" prop="subject">
+              <el-select
+                v-model="form.subject"
+                placeholder="请选择所属学科"
+                style="width: 300px;"
+              >
+                <el-option
+                  v-for="item in subjectList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+              <!-- <el-input v-model="form.subject" placeholder="请输入所属学科" style="width: 300px;"></el-input> -->
+            </el-form-item>
+          </div>
+          <el-form-item label="模板简介(40字以内)" prop="brief">
+            <el-input
+              type="textarea"
+              v-model="form.brief"
+              style="width: 100%;"
+              :rows="3"
+              :maxlength="40"
+              resize="none"
+              placeholder="请输入模板简介"
+            ></el-input>
+          </el-form-item>
+          <el-form-item
+            label="权限管理"
+            style="display: flex;flex-direction: column;align-items: flex-start;"
+          >
+            <div>
+              公开到社区:<el-switch v-model="form.permissions"></el-switch>
+            </div>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="bfd_bottom" v-loading="loading">
+        <el-button @click="close()">取消</el-button>
+        <el-button type="primary" @click="submitBtn('ruleForm')"
+          >保存</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
-		from:'hk',
-		to:'cn'
-})
+  from: "hk",
+  to: "cn"
+});
 export default {
-	emits: ["success"],
-	props: {
-		dataList:{
-			type:Array,
-			default:()=>{return []}
-		},
-		bmData:{
-			type:Object,
-			default:()=>{return {}}
-		},
-	},
-	data() {
-		return {
-			loading: false,
-			dialogVisible: false,
-			userId: this.$route.query["userid"],
-			oid: this.$route.query["oid"],
-			org: this.$route.query["org"],
-			subjectList:[
-				{value:'1',label:'语文'},
-				{value:'2',label:'数学'},
-				{value:'3',label:'英语'},
-				{value:'4',label:'科学'},
-				{value:'5',label:'物理'},
-				{value:'6',label:'化学'},
-				{value:'7',label:'生物'},
-				{value:'8',label:'历史'},
-				{value:'9',label:'地理'},
-				{value:'10',label:'政治'},
-				
-			],
-			form:{
-				name:"",
-				subject:"",
-				brief:"",
-				permissions:false,
-			},
-			rules:{
-				name:[{required:true,message:"请输入课程名称",trigger:"blur"}],
-				subject:[{required:true,message:"请输入所属学科",trigger:"blur"}]
-			},
+  emits: ["success"],
+  props: {
+    dataList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    },
+    bmData: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      dialogVisible: false,
+      userId: this.$route.query["userid"],
+      oid: this.$route.query["oid"],
+      org: this.$route.query["org"],
+      subjectList: [
+        { value: "1", label: "语文" },
+        { value: "2", label: "数学" },
+        { value: "3", label: "英语" },
+        { value: "4", label: "科学" },
+        { value: "5", label: "物理" },
+        { value: "6", label: "化学" },
+        { value: "7", label: "生物" },
+        { value: "8", label: "历史" },
+        { value: "9", label: "地理" },
+        { value: "10", label: "政治" }
+      ],
+      form: {
+        name: "",
+        subject: "",
+        brief: "",
+        permissions: false
+      },
+      rules: {
+        name: [{ required: true, message: "请输入课程名称", trigger: "blur" }],
+        subject: [
+          { required: true, message: "请输入所属学科", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  methods: {
+    open(_json) {
+      this.form = {
+        name: "",
+        subject: "",
+        brief: "",
+        permissions: false
+      };
+      this.loading = false;
+      this.dialogVisible = true;
+    },
+    close() {
+      this.dialogVisible = false;
+      this.form = {
+        name: "",
+        subject: "",
+        brief: "",
+        permissions: false
+      };
+    },
+    submitBtn(ref) {
+      this.$refs[ref].validate(valid => {
+        if (valid) {
+          this.loading = true;
+          let _data = JSON.parse(JSON.stringify(this.dataList));
+          let _result = [];
 
-		};
-	},
-	methods: {
-		open(_json) {
-			this.form = {
-				name:"",
-				subject:"",
-				brief:"",
-				permissions:false,
-			}
-			this.loading = false;
-			this.dialogVisible = true;
-		},
-		close() {
-			this.dialogVisible = false;
-			this.form = {
-				name:"",
-				subject:"",
-				brief:"",
-				permissions:false,
-			};
-		},
-		submitBtn(ref) {
-			this.$refs[ref].validate((valid) => {
-          if (valid) {
-						this.loading = true;
-						let _data = JSON.parse(JSON.stringify(this.dataList));
-						let _result = [];
-						
-						_data.forEach(i=>{
-							if(converter(i.jsonData.name)==converter('词频词汇分析')){
-								return
-							}else{
-								i.jsonData.content = "";
-								i.jsonData.dataFileList = [];
-								i.jsonData.fileList = [];
-								i.createtime = "";
-								i.id = "",
-								i.tId = "",
-								i.userid = "";
-								_result.push(i)
-							}
-							
-							
-						})
+          _data.forEach(i => {
+            if (converter(i.jsonData.name) == converter("词频词汇分析")) {
+              return;
+            } else {
+              i.jsonData.content = "";
+              i.jsonData.dataFileList = [];
+              i.jsonData.fileList = [];
+              i.createtime = "";
+              (i.id = ""), (i.tId = ""), (i.userid = "");
+              if (i.jsonData.eChartData) {
+                delete i.jsonData.eChartData;
+              }
+              if (i.jsonData.RT && i.jsonData.CH) {
+                delete i.jsonData.RT;
+                delete i.jsonData.CH;
+              }
+              _result.push(i);
+            }
+          });
 
-						let otherData = {
-							isOtherData:true,
-							dialogTagList:this.bmData.jsonData.dialogTagList,
-						}
-						_result.push(otherData)
-						// console.log(_result)
-						// this.loading = false
-						// return
-						let params = [{
-							title:this.form.name,
-							subject:this.form.subject,
-							uid:this.userId,
-							brief:this.form.brief,
-							per:this.form.permissions?1:0,
-							jsonData:JSON.stringify(_result),
-						}]
-						// this.loading = false;
-						// return console.log(params);
-						this.ajax.post(this.$store.state.api+"insertClassroomTemplate",params).then(res=>{
-							console.log(res)
-							this.$message.success("另存模板成功");
-							this.loading = false;
-							this.close();
-						}).catch(e=>{
-							console.log(e);
-							this.$message.error("另存失败");
-							this.loading = false;
-						})
-						// return console.log(params)
-          }
-        });
-		},
-
-	},
+          let otherData = {
+            isOtherData: true,
+            dialogTagList: this.bmData.jsonData.dialogTagList
+          };
+          _result.push(otherData);
+          // console.log(_result)
+          // this.loading = false
+          // return
+          let params = [
+            {
+              title: this.form.name,
+              subject: this.form.subject,
+              uid: this.userId,
+              brief: this.form.brief,
+              per: this.form.permissions ? 1 : 0,
+              jsonData: JSON.stringify(_result)
+            }
+          ];
+          // this.loading = false;
+          // return console.log(params);
+          this.ajax
+            .post(this.$store.state.api + "insertClassroomTemplate", params)
+            .then(res => {
+              console.log(res);
+              this.$message.success("另存模板成功");
+              this.loading = false;
+              this.close();
+            })
+            .catch(e => {
+              console.log(e);
+              this.$message.error("另存失败");
+              this.loading = false;
+            });
+          // return console.log(params)
+        }
+      });
+    }
+  }
 };
 </script>
 
 <style scoped>
 .bindingFormDialog >>> .el-dialog {
-	min-width: 700px;
+  min-width: 700px;
 
-	height: 500px;
-	box-shadow: 0px 0 8px 0px #555555;
-	border-radius: 8px;
-	background-color: #fff;
-	/* top: 0px; */
-	/* margin: 0 auto; */
-	overflow: hidden;
+  height: 500px;
+  box-shadow: 0px 0 8px 0px #555555;
+  border-radius: 8px;
+  background-color: #fff;
+  /* top: 0px; */
+  /* margin: 0 auto; */
+  overflow: hidden;
 }
 .bindingFormDialog >>> .el-dialog__body {
-	height: 100%;
-	min-width: 700px;
-	flex-shrink: 0;
-	box-sizing: border-box;
-	padding-bottom: 50px;
-	padding-top: 10px;
+  height: 100%;
+  min-width: 700px;
+  flex-shrink: 0;
+  box-sizing: border-box;
+  padding-bottom: 50px;
+  padding-top: 10px;
 }
 .bindingFormDialog >>> .el-dialog__header {
-	display: none !important;
+  display: none !important;
 }
 
 .a-d-top {
-	/* background: #adadad; */
-	display: flex;
-	flex-direction: row;
-	flex-wrap: nowrap;
-	align-items: center;
-	justify-content: space-between;
-	height: 54px;
-	border-radius: 8px 8px 0 0;
-	user-select: none;
-	border-bottom: 1px #ccc solid;
+  /* background: #adadad; */
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  height: 54px;
+  border-radius: 8px 8px 0 0;
+  user-select: none;
+  border-bottom: 1px #ccc solid;
 }
 .a-d-top >>> .el-input__inner {
-	width: 320px;
-	height: 32px;
+  width: 320px;
+  height: 32px;
 }
 .a-d-top >>> .el-input__icon {
-	line-height: 32px;
+  line-height: 32px;
 }
 
 .a-d-topTit {
-	/* width: 171px; */
-	/* margin-left: 20px; */
-	height: 32px;
-	display: flex;
-	align-items: center;
-	font-family: PingFang SC;
-	box-sizing: border-box;
-	padding: 5px;
-	line-height: 22px;
-	justify-content: center;
-	/* text-align: left; */
+  /* width: 171px; */
+  /* margin-left: 20px; */
+  height: 32px;
+  display: flex;
+  align-items: center;
+  font-family: PingFang SC;
+  box-sizing: border-box;
+  padding: 5px;
+  line-height: 22px;
+  justify-content: center;
+  /* text-align: left; */
 }
 
 .a-d-t-right {
-	width: 40px;
-	height: 40px;
-	margin-right: 10px;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	color: black !important;
+  width: 40px;
+  height: 40px;
+  margin-right: 10px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: black !important;
 }
 
 .a-d-t-right > span {
-	width: 25px;
-	height: 25px;
-	border-radius: 25px;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	/* align-items: center; */
-	font-size: 22px;
-	color: #fff;
-	/* background-color: #adadad; */
-	cursor: pointer;
-	/* background-color: #e6e6e6; */
-	color: #adadad;
+  width: 25px;
+  height: 25px;
+  border-radius: 25px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  /* align-items: center; */
+  font-size: 22px;
+  color: #fff;
+  /* background-color: #adadad; */
+  cursor: pointer;
+  /* background-color: #e6e6e6; */
+  color: #adadad;
 }
 
 .bfd_box {
-	width: 100%;
-	height: calc(100% - 80px);
-	overflow: hidden;
+  width: 100%;
+  height: calc(100% - 80px);
+  overflow: hidden;
 }
 
 .bfd_bottom {
-	width: 100%;
-	height: calc(40px);
-	margin-top: 10px;
-	display: flex;
-	justify-content: flex-end;
+  width: 100%;
+  height: calc(40px);
+  margin-top: 10px;
+  display: flex;
+  justify-content: flex-end;
 }
 
 .bfd_b_left {
-	flex: 1;
-	height: 100%;
-	display: flex;
-	align-items: center;
+  flex: 1;
+  height: 100%;
+  display: flex;
+  align-items: center;
 }
 
 .a_d_t_input {
-	display: flex;
-	align-items: center;
+  display: flex;
+  align-items: center;
 }
 
 /* .bfd_b_right {

+ 9 - 0
src/components/pages/classroomObservation/index.vue

@@ -378,6 +378,15 @@ export default {
           !i.isOtherData &&
           converter(i.jsonData.name) != converter("词频词汇分析")
       );
+			json.forEach(i=>{
+				if(i.jsonData.eChartData){
+					delete i.jsonData.eChartData
+				}
+				if(i.jsonData.RT && i.jsonData.CH){
+					delete i.jsonData.RT
+					delete i.jsonData.CH
+				}
+			})
       return new Promise((resolve, reject) => {
         this.loading = true;
         const _newTid = uuidv4();

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio