Sfoglia il codice sorgente

Merge branch 'beta'

lsc 1 anno fa
parent
commit
1447ea68c7

+ 1 - 1
dist/index.html

@@ -27,7 +27,7 @@
     html,
     body{
       font-family: '黑体';
-    }</style><link href=./static/css/app.8846318812133b142a5bb09ff56c3bdd.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.733814fc48c2bd2222aa.js></script><script type=text/javascript src=./static/js/app.9e36823772011c9fca0d.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.a5c7faa819755c680e6ed48d25663686.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.733814fc48c2bd2222aa.js></script><script type=text/javascript src=./static/js/app.bcb1b3957d9b8393abb5.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.8846318812133b142a5bb09ff56c3bdd.css


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


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


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


BIN
dist/static/img/aiAvatar.9613d71.png


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


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


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


BIN
src/assets/icon/course/comment.png


+ 106 - 104
src/components/classRoomHelper/component/dialogArea.vue

@@ -19,24 +19,41 @@
               <span v-else>Ai</span>
             </div>
             <div class="d_t_c_a_right">
-              <div class="d_t_c_a_r_content" style="display: flex;justify-content: space-between;flex-wrap: wrap;" v-if="item.content.includes('图片')">
+              <div
+                class="d_t_c_a_r_content"
+                style="display: flex;justify-content: space-between;flex-wrap: wrap;"
+                v-if="item.content.includes('图片')"
+              >
                 <div
                   v-if="!pan(item.aiContent).length"
                   class="d_t_c_a_r_content"
                   v-loading="item.loading"
                   v-html="item.aiContent"
                 ></div>
-                
+
                 <div v-else v-for="i in pan(item.aiContent)">
-                    <img style="width: 120px;height: 120px;" :src="i.image" alt="" @click="previewImg(i.image)">
+                  <img
+                    style="width: 130px;height: 130px;"
+                    :src="i.image"
+                    alt=""
+                    @click="previewImg(i.image)"
+                  />
                 </div>
               </div>
               <div
                 v-else
                 class="d_t_c_a_r_content"
                 v-loading="item.loading"
-                v-html="item.aiContent"
+                v-html="htmlContent(item.aiContent)"
               ></div>
+              <div v-if="!item.content.includes('图片')" class="aiCopy">
+                <img
+                  @click="onCopy(item.aiContent)"
+                  style="width: 30px;"
+                  src="https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%A4%8D%E5%88%B6%E5%9B%BE%E6%A0%871715569581741.png"
+                  alt=""
+                />
+              </div>
               <div class="d_t_c_a_r_time">{{ item.createtime }}</div>
             </div>
           </div>
@@ -244,101 +261,49 @@ export default {
       rightRole: -1,
       loading: false,
       chatLoading: false,
-      roleList2: [
-        {
-          id: 3,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "莱昂纳多·达芬奇",
-          bir: "我是莱昂纳多·达芬奇"
-        },
-        {
-          id: 4,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "列文虎克",
-          bir: "我是列文虎克"
-        },
-        {
-          id: 5,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "詹姆斯·瓦特",
-          bir: "我是詹姆斯·瓦特"
-        },
-        {
-          id: 6,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "瑞秋·卡森",
-          bir: "我是瑞秋·卡森"
-        },
-        {
-          id: 7,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "尼古拉·特斯拉",
-          bir: "我是尼古拉·特斯拉"
-        },
-        {
-          id: 8,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "约翰·穆尔",
-          bir: "我是约翰·穆尔"
-        }
-      ],
-      roleList: [
-        {
-          id: 0,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "爱因斯坦",
-          bir: "我是爱因斯坦"
-        },
-        {
-          id: 1,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "居里夫人",
-          bir: "我是居里夫人"
-        },
-        {
-          id: 2,
-          avatar: require("../../../assets/icon/course/aiAvatar.png"),
-          name: "达尔文",
-          bir: "我是达尔文"
-        }
-        // {id:3,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"莱昂纳多·达芬奇"},
-        // {id:4,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"列文虎克"},
-        // {id:5,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"詹姆斯·瓦特"},
-        // {id:6,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"瑞秋·卡森"},
-        // {id:7,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"尼古拉·特斯拉"},
-        // {id:8,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"约翰·穆尔"},
-        // {id:9,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"艾萨克·牛顿"},
-        // {id:10,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"伽利略"},
-        // {id:11,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"格雷戈尔·孟德尔"},
-        // {id:12,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"张衡"},
-        // {id:13,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"李时珍"},
-        // {id:14,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"钱学森"},
-        // {id:15,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"阿基米德"},
-        // {id:16,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"霍金"},
-        // {id:17,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"蔡伦"},
-        // {id:18,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"詹姆斯·瓦特"},
-        // {id:19,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"路易·巴斯德"},
-        // {id:20,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"阿尔弗雷德·诺贝尔"},
-        // {id:21,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"詹姆斯·麦克斯韦"},
-        // {id:22,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"亚历山大·格拉汉姆·贝尔"},
-        // {id:23,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"约翰内斯·开普勒"},
-        // {id:24,avatar:require("../../../assets/icon/course/aiAvatar.png"),name:"安德烈·安培"},
-      ],
-      chatList: []
+      roleList2: [],
+      chatList: [],
+      nowChatList: []
     };
   },
   computed: {
     pan() {
-      return (content) => {
+      return content => {
         try {
-        return JSON.parse(content)
-      } catch (error) {
-        return []
-      }
+          return JSON.parse(content);
+        } catch (error) {
+          return [];
+        }
+      };
+    },
+    htmlContent() {
+      const md = new MarkdownIt();
+      return _md => {
+        return md.render(_md);
       };
     }
   },
   methods: {
+    onCopy(content) {
+      // 创建临时textarea元素
+      const tempInput = document.createElement("textarea");
+      tempInput.value = content; // 设置要复制的内容
+      // 隐藏元素
+      tempInput.style.position = "absolute";
+      tempInput.style.left = "-9999px";
+      // 将元素添加到DOM中
+      document.body.appendChild(tempInput);
+      // 选中元素内容
+      tempInput.select();
+      // 执行复制操作
+      document.execCommand("copy");
+      // 移除临时元素
+      document.body.removeChild(tempInput);
+      this.$message({
+        message: "复制成功",
+        type: "success"
+      });
+    },
     previewImg(url) {
       this.$hevueImgPreview(url);
     },
@@ -390,7 +355,7 @@ export default {
           assistant_id: this.choseRoleItem.assistant_id,
           userId: this.userid,
           message: _text,
-          session_name: `${this.courseId}-studyStudent`,
+          session_name: `${this.courseId}-studyStudent-md`,
           uid: _uid,
           file_ids: []
         };
@@ -411,8 +376,6 @@ export default {
       } else {
         let _uuid = uuidv4();
 
-        
-
         this.chatList.push({
           role: "user",
           content: `${_text}`,
@@ -427,6 +390,34 @@ export default {
           loading: true
         });
         this.scrollBottom();
+        let history = [];
+        this.nowChatList.forEach(i => {
+          if (i.content == "wanSearch") {
+            return history.push({
+              role: "assistant",
+              content: JSON.stringify(i.aiContent)
+            });
+          } else if (i.content == "getImage") {
+            return history.push({
+              role: "assistant",
+              content: i.aiContent
+            });
+          }
+          if (i.content) {
+            history.push({
+              role: "user",
+              content: i.content
+            });
+          }
+          if (i.aiContent) {
+            history.push({
+              role: "assistant",
+              content: i.aiContent
+            });
+          }
+        });
+        history.push({ role: "user", content: _text });
+        // history.pop();
         let params = {
           model: "gpt-3.5-turbo",
           temperature: 0,
@@ -434,12 +425,12 @@ export default {
           top_p: 1,
           frequency_penalty: 0,
           presence_penalty: 0,
-          messages: [{ role: "user", content: _text }],
+          messages: history,
           uid: _uuid,
-          mind_map_question: ""
+          mind_map_question: _text
         };
         this.text = "";
-        console.log('发送信息',params);
+        console.log("发送信息", params);
 
         this.ajax
           .post("https://gpt4.cocorobo.cn/chat", params)
@@ -462,7 +453,7 @@ export default {
       let _source = new EventSource(`https://gpt4.cocorobo.cn/stream/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
       let _allText = "";
       let _mdText = "";
-      const md = new MarkdownIt();
+      // const md = new MarkdownIt();
       _source.onmessage = _e => {
         if (_e.data.replace("'", "").replace("'", "") == "[DONE]") {
           //对话已经完成
@@ -474,6 +465,7 @@ export default {
           this.chatList.find(i => i.uid == _uid).isalltext = true;
           this.chatList.find(i => i.uid == _uid).isShowSynchronization = true;
           this.chatList.find(i => i.uid == _uid).loading = false;
+          this.nowChatList.push(this.chatList.find(i => i.uid == _uid));
           // 这里保存对话
           this.insertChat(_uid);
           return;
@@ -491,7 +483,7 @@ export default {
           _mdText = _mdText.replace(/\\/g, "");
           if (_allText.split("```").length % 2 == 0) _mdText += "\n```\n";
           //转化返回的回复流数据
-          _mdText = md.render(_mdText);
+          // _mdText = md.render(_mdText);
           this.chatList.find(i => i.uid == _uid).aiContent = _mdText;
           this.chatList.find(i => i.uid == _uid).loading = false;
           this.scrollBottom();
@@ -505,7 +497,7 @@ export default {
       ); //http://gpt4.cocorobo.cn:8011/question/   https://gpt4.cocorobo.cn/question/
       let _allText = "";
       let _mdText = "";
-      const md = new MarkdownIt();
+      // const md = new MarkdownIt();
       _source.onmessage = _e => {
         let _eData = JSON.parse(_e.data);
         if (_eData.content.replace("'", "").replace("'", "") == "[DONE]") {
@@ -522,7 +514,7 @@ export default {
           this.chatList.find(i => i.uid == _uid).isalltext = true;
           this.chatList.find(i => i.uid == _uid).isShowSynchronization = true;
           this.chatList.find(i => i.uid == _uid).loading = false;
-
+          this.nowChatList.push(this.chatList.find(i => i.uid == _uid));
           this.insertChat(_uid);
         } else {
           let _text = _eData.content.replace("'", "").replace("'", "");
@@ -536,7 +528,7 @@ export default {
           _mdText = _mdText.replace(/\\/g, "");
           if (_allText.split("```").length % 2 == 0) _mdText += "\n```\n";
           //转化返回的回复流数据
-          _mdText = md.render(_mdText);
+          // _mdText = md.render(_mdText);
           this.chatList.find(i => i.uid == _uid).aiContent = _mdText;
           this.chatList.find(i => i.uid == _uid).loading = false;
           this.$nextTick(() => {
@@ -560,7 +552,7 @@ export default {
         alltext: _data.aiContent,
         type: "chat",
         filename: _data.filename,
-        session_name: `${this.courseId}-studyStudent` //这是对话记录位置
+        session_name: `${this.courseId}-studyStudent-md` //这是对话记录位置
       };
       this.ajax
         .post("https://gpt4.cocorobo.cn/insert_chat", params)
@@ -577,7 +569,7 @@ export default {
           userid: this.userid,
           groupid: "602def61-005d-11ee-91d8-005056b8q12w",
           // session_name:``
-          session_name: `${this.courseId}-studyStudent`
+          session_name: `${this.courseId}-studyStudent-md`
         };
         this.ajax
           .post("https://gpt4.cocorobo.cn/get_agent_park_chat", params)
@@ -670,6 +662,7 @@ export default {
       // this.rightRole = this.roleType;
       if (this.choseRoleItem.assistant_id) {
         this.chatList = [];
+        this.nowChatList = [];
         let _uuid = uuidv4();
         this.chatList.push({
           role: "user",
@@ -686,6 +679,7 @@ export default {
           is_mind_map: false,
           loading: false
         });
+
         this.scrollBottom();
       }
 
@@ -852,6 +846,7 @@ export default {
     this.getChatList().then(_ => {
       this.scrollBottom();
     });
+    this.nowChatList = [];
   }
 };
 </script>
@@ -867,7 +862,13 @@ export default {
   width: 100%;
   height: 100%;
 }
-
+.aiCopy {
+  position: absolute;
+  right: 5px;
+  bottom: 0%;
+  /* transform: translate(0, -30%); */
+  cursor: pointer;
+}
 .characterBlock {
   display: flex;
   background: rgba(54, 169, 252, 1);
@@ -994,6 +995,7 @@ export default {
   box-sizing: border-box;
   padding-right: 35px;
   margin-top: 10px;
+  position: relative;
 }
 
 .d_t_c_a_right {

+ 86 - 27
src/components/classRoomHelper/component/searchArea.vue

@@ -49,18 +49,12 @@
           class="s_t_c_ai"
           v-if="item.content != 'wanSearch' && item.content != 'getImage'"
         >
-          <div class="aiCopy">
-            <img
-              style="width: 30px;"
-              src="https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%A4%8D%E5%88%B6%E5%9B%BE%E6%A0%871715569581741.png"
-              alt=""
-            />
-          </div>
+          
           <div class="s_t_c_a_left">
             <span>Ai</span>
           </div>
           <div class="s_t_c_a_right">
-            <div class="s_t_c_a_r_content" style="display: flex;justify-content: space-between;flex-wrap: wrap;" v-if="item.content.includes('图片')">
+            <div class="s_t_c_a_r_content" v-if="item.content.includes('图片')" style="display: flex;justify-content: space-between;flex-wrap: wrap;" >
               <div
                   v-if="!pan(item.aiContent).length"
                   class="d_t_c_a_r_content"
@@ -68,16 +62,23 @@
                   v-html="item.aiContent"
                 ></div>
               <div v-else  v-for="(i,index) in pan(item.aiContent)" :key=index>
-                  <img style="width: 120px;height: 120px;" :src="i.image" alt=""  @click="previewImg(i.image)">
+                  <img style="width: 130px;height: 130px;" :src="i.image" alt=""  @click="previewImg(i.image)">
               </div>
             </div>
             <div
               v-else
               class="s_t_c_a_r_content"
               v-loading="item.loading"
-              v-html="item.aiContent"
+              v-html="htmlContent(item.aiContent)"
             ></div>
-
+            <div v-if="!item.content.includes('图片')" class="aiCopy">
+            <img
+                @click="onCopy(item.aiContent)"
+                style="width: 30px;"
+                src="https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%A4%8D%E5%88%B6%E5%9B%BE%E6%A0%871715569581741.png"
+                alt=""
+              />
+            </div>
             <!-- <div
               class="s_t_c_a_r_contentImage"
               v-loading="item.loading"
@@ -182,7 +183,8 @@ export default {
       userid: this.$route.query.userid,
       courseId: this.$route.query.courseId,
       imgNumList: ["U1", "U2", "U3", "U4"],
-      chatList: []
+      chatList: [],
+			nowChatList:[],
     };
   },
   computed: {
@@ -194,9 +196,35 @@ export default {
         return []
       }
       };
-    }
+    },
+		htmlContent(){
+			const md = new MarkdownIt()
+			return (_md)=>{
+				return md.render(_md);
+			}
+		},
   },
   methods: {
+    onCopy(content){
+      // 创建临时textarea元素
+      const tempInput = document.createElement('textarea');
+      tempInput.value = content; // 设置要复制的内容
+      // 隐藏元素
+      tempInput.style.position = 'absolute';
+      tempInput.style.left = '-9999px';
+      // 将元素添加到DOM中
+      document.body.appendChild(tempInput);
+      // 选中元素内容
+      tempInput.select();
+      // 执行复制操作
+      document.execCommand('copy');
+      // 移除临时元素
+      document.body.removeChild(tempInput);
+      this.$message({
+          message: '复制成功',
+          type: 'success'
+        });
+    },
     previewImg(url) {
       this.$hevueImgPreview(url);
     },
@@ -236,7 +264,7 @@ export default {
       this.scrollBottom();
       if (_text.indexOf("视频") != -1) {
         _msg = `
-        NOTICE
+NOTICE
 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.
@@ -250,11 +278,11 @@ Instruction: Based on the context, follow "Format example", write content.
 学生年级:${this.courseDetail.classname ? this.courseDetail.classname : "无"}
 
 ## 规则
-    1. 输出结果必须真实有效,不要捏造无效的视频链接
-    2. 当课程信息中的子条目内容为“无”时,无视这些条目进行输出即可。
-    3. 如果没有相关内容,请跟用户表明没有找到相关视频链接内容,然后推荐搜索建议
-    4. 在ted.com等教育网站上搜索视频,并且以有序列表的形式将结果输出给用户
-    5. 请一步步思考如何根据现有信息推送视频,但是最终输出结果不需要包含你的思考过程,只需要包含视频标题+链接。
+1. 输出结果必须真实有效,不要捏造无效的视频链接
+2. 当课程信息中的子条目内容为“无”时,无视这些条目进行输出即可。
+3. 如果没有相关内容,请跟用户表明没有找到相关视频链接内容,然后推荐搜索建议
+4. 在ted.com等教育网站上搜索视频,并且以有序列表的形式将结果输出给用户
+5. 请一步步思考如何根据现有信息推送视频,但是最终输出结果不需要包含你的思考过程,只需要包含视频标题+链接。
 
 # Format example
 视频来源: Ted.com
@@ -304,7 +332,6 @@ Instruction: Based on the context, follow "Format example", write content.
 
         return;
       }
-      console.log(9999);
       //         num=0
       //       	_msg = `
       //         NOTICE
@@ -330,7 +357,35 @@ Instruction: Based on the context, follow "Format example", write content.
       //       `
       //       }
       let history = [];
-      if (_msg) {
+			this.nowChatList.forEach(i=>{
+				if(i.content=='wanSearch'){
+					// history.push({
+					// 	role:"assistant",
+					// 	content: JSON.stringify(i.aiContent)
+					// })
+					return 
+					
+				}else if(i.content == 'getImage'){
+					return history.push({
+						role:"assistant",
+						content:i.aiContent
+					})
+				}
+				if(i.content){
+					history.push({
+					role:"user",
+					content:i.content,
+				})
+				}
+				if(i.aiContent){
+					history.push({
+					role:"assistant",
+					content:i.aiContent
+				})
+				}
+			})
+			// history.pop();
+			if (_msg) {
         history.push({ role: "user", content: _msg });
       }
       history.push({ role: "user", content: _text });
@@ -343,7 +398,7 @@ Instruction: Based on the context, follow "Format example", write content.
         presence_penalty: 0,
         messages: history,
         uid: _uuid,
-        mind_map_question: ""
+        mind_map_question: _text
       };
       this.text = "";
 
@@ -367,7 +422,7 @@ Instruction: Based on the context, follow "Format example", write content.
       let _source = new EventSource(`https://gpt4.cocorobo.cn/stream/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
       let _allText = "";
       let _mdText = "";
-      const md = new MarkdownIt();
+      // const md = new MarkdownIt();
       _source.onmessage = _e => {
         if (_e.data.replace("'", "").replace("'", "") == "[DONE]") {
           //对话已经完成
@@ -379,6 +434,7 @@ Instruction: Based on the context, follow "Format example", write content.
           this.chatList.find(i => i.uid == _uid).isalltext = true;
           this.chatList.find(i => i.uid == _uid).isShowSynchronization = true;
           this.chatList.find(i => i.uid == _uid).loading = false;
+					this.nowChatList.push(this.chatList.find(i=>i.uid==_uid));
           // 这里保存对话
           this.insertChat(_uid);
           return;
@@ -396,7 +452,7 @@ Instruction: Based on the context, follow "Format example", write content.
           _mdText = _mdText.replace(/\\/g, "");
           if (_allText.split("```").length % 2 == 0) _mdText += "\n```\n";
           //转化返回的回复流数据
-          _mdText = md.render(_mdText);
+          // _mdText = md.render(_mdText);
           this.chatList.find(i => i.uid == _uid).aiContent = _mdText;
           this.chatList.find(i => i.uid == _uid).loading = false;
           this.scrollBottom();
@@ -424,6 +480,7 @@ Instruction: Based on the context, follow "Format example", write content.
           this.chatList.find(i => i.uid == _uid).isalltext = true;
           this.chatList.find(i => i.uid == _uid).isShowSynchronization = true;
           this.chatList.find(i => i.uid == _uid).loading = false;
+					this.nowChatList.push(this.chatList.find(i=>i.uid==_uid));
           this.scrollBottom();
           // 这里保存对话
           return;
@@ -459,7 +516,7 @@ Instruction: Based on the context, follow "Format example", write content.
         alltext: _data.aiContent,
         type: "chat",
         filename: _data.filename,
-        session_name: `${this.courseId}-studyStudent` //这是对话记录位置
+        session_name: `${this.courseId}-studyStudent-md` //这是对话记录位置
       };
       this.ajax
         .post("https://gpt4.cocorobo.cn/insert_chat", params)
@@ -475,7 +532,7 @@ Instruction: Based on the context, follow "Format example", write content.
           userid: this.userid,
           groupid: "602def61-005d-11ee-91d8-005056b8q12w",
           // session_name:``
-          session_name: `${this.courseId}-studyStudent`
+          session_name: `${this.courseId}-studyStudent-md`
         };
         this.ajax
           .post("https://gpt4.cocorobo.cn/get_agent_park_chat", params)
@@ -586,6 +643,7 @@ Instruction: Based on the context, follow "Format example", write content.
         is_mind_map: false,
         loading: true
       });
+
       this.scrollBottom();
 
       let params = {
@@ -627,6 +685,7 @@ Instruction: Based on the context, follow "Format example", write content.
       this.scrollBottom();
       this.getWantSearch();
     });
+		this.nowChatList = [];
   }
 };
 </script>
@@ -765,7 +824,7 @@ Instruction: Based on the context, follow "Format example", write content.
   position: absolute;
   right: 5px;
   bottom: 0%;
-  transform: translate(0, -30%);
+  /* transform: translate(0, -30%); */
   cursor: pointer;
 }
 

+ 156 - 48
src/components/classRoomHelper/component/taskArea.vue

@@ -63,27 +63,44 @@
         </div>
         <div class="t_t_c_ai">
           <div class="t_t_c_a_left">
-						<el-avatar v-if="item.filename" :src="item.filename"></el-avatar>
-              <span v-else>Ai</span>
+            <el-avatar v-if="item.filename" :src="item.filename"></el-avatar>
+            <span v-else>Ai</span>
           </div>
           <div class="t_t_c_a_right">
-            <div class="t_t_c_a_r_content" style="display: flex;justify-content: space-between;flex-wrap: wrap;" v-if="item.content.includes('图片')">
+            <div
+              class="t_t_c_a_r_content"
+              style="display: flex;justify-content: space-between;flex-wrap: wrap;"
+              v-if="item.content.includes('图片')"
+            >
               <div
-                  v-if="!pan(item.aiContent).length"
-                  class="d_t_c_a_r_content"
-                  v-loading="item.loading"
-                  v-html="item.aiContent"
-                ></div>
+                v-if="!pan(item.aiContent).length"
+                class="d_t_c_a_r_content"
+                v-loading="item.loading"
+                v-html="item.aiContent"
+              ></div>
               <div v-else v-for="i in pan(item.aiContent)">
-                  <img style="width: 120px;height: 120px;" :src="i.image" alt=""  @click="previewImg(i.image)">
+                <img
+                  style="width: 130px;height: 130px;"
+                  :src="i.image"
+                  alt=""
+                  @click="previewImg(i.image)"
+                />
               </div>
             </div>
             <div
               v-else
               class="t_t_c_a_r_content"
               v-loading="item.loading"
-              v-html="item.aiContent"
+              v-html="htmlContent(item.aiContent)"
             ></div>
+            <div v-if="!item.content.includes('图片')" class="aiCopy">
+              <img
+                @click="onCopy(item.aiContent)"
+                style="width: 30px;"
+                src="https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%A4%8D%E5%88%B6%E5%9B%BE%E6%A0%871715569581741.png"
+                alt=""
+              />
+            </div>
             <div class="t_t_c_a_r_time">{{ item.createtime }}</div>
           </div>
         </div>
@@ -96,7 +113,7 @@
         <div class="t_b_ba_item" @click="sendType('智能出题')">智能出题</div>
         <!-- <div class="t_b_ba_item" @click="sendType('优秀标兵')">优秀标兵</div> -->
         <div class="t_b_ba_item" @click="sendType('扩展知识')">扩展知识</div>
-				<div class="t_b_ba_item" @click="clear()">清空聊天记录</div>
+        <div class="t_b_ba_item" @click="clear()">清空聊天记录</div>
       </div>
       <div class="t_b_inputArea">
         <!-- <div class="t_b_tape" @click="goTape()"></div> -->
@@ -139,35 +156,60 @@ export default {
       text: "",
       loading: false,
       chatLoading: false,
-      chatList: []
+      chatList: [],
+      nowChatList: []
     };
   },
   computed: {
     pan() {
-      return (content) => {
+      return content => {
         try {
-        return JSON.parse(content)
-      } catch (error) {
-        return []
-      }
+          return JSON.parse(content);
+        } catch (error) {
+          return [];
+        }
+      };
+    },
+    htmlContent() {
+      const md = new MarkdownIt();
+      return _md => {
+        return md.render(_md);
       };
     }
   },
   methods: {
+    onCopy(content) {
+      // 创建临时textarea元素
+      const tempInput = document.createElement("textarea");
+      tempInput.value = content; // 设置要复制的内容
+      // 隐藏元素
+      tempInput.style.position = "absolute";
+      tempInput.style.left = "-9999px";
+      // 将元素添加到DOM中
+      document.body.appendChild(tempInput);
+      // 选中元素内容
+      tempInput.select();
+      // 执行复制操作
+      document.execCommand("copy");
+      // 移除临时元素
+      document.body.removeChild(tempInput);
+      this.$message({
+        message: "复制成功",
+        type: "success"
+      });
+    },
     exportCourse() {
       let _user = `<div style="font-size:30px;margin-top:10px;"><span style="color: rgb(113, 124, 141); font-weight: 400;">创建者:</span><span>${this.courseDetail.username}</span></div>`;
       const _chapInfo = JSON.parse(this.courseDetail.chapters);
       let _chap = "";
 
       for (let i = 0; i < _chapInfo.length; i++) {
-        _chap += `<div style="font-size:40px;margin-top:70px;"><span>第${
-          i + 1
-        }阶段:${_chapInfo[i].dyName}</span></div>`;
+        _chap += `<div style="font-size:40px;margin-top:70px;"><span>第${i +
+          1}阶段:${_chapInfo[i].dyName}</span></div>`;
         let _task = _chapInfo[i].chapterInfo[0].taskJson;
         for (let j = 0; j < _task.length; j++) {
-          _chap += `<div style="font-size:30px;margin-top:50px;"><span>任务${
-            j + 1
-          }:${_task[j].task}</span></div>`;
+          _chap += `<div style="font-size:30px;margin-top:50px;"><span>任务${j +
+            1}:${_task[j].task}</span></div>`;
           if (_task[j].taskDetail) {
             _chap += `<div style="font-size:25px;margin-top:40px;">任务描述</div>`;
             _chap += `<div style="font-size:25px;margin-top:10px;">${_task[j].taskDetail}</div>`;
@@ -175,9 +217,8 @@ export default {
           let _tool = _task[j].toolChoose;
           if (_tool[0].tool.length) {
             for (let z = 0; z < _tool.length; z++) {
-              _chap += `<div style="font-size:23px;margin-top:30px;"><span>步骤${
-                z + 1
-              }:</span><span>${
+              _chap += `<div style="font-size:23px;margin-top:30px;"><span>步骤${z +
+                1}:</span><span>${
                 tools[_tool[z].tool[0]] ? tools[_tool[z].tool[0]].name : ""
               }</span></div>`;
 
@@ -191,20 +232,20 @@ export default {
       }
 
       let _html = _user + _chap;
-      return _html
+      return _html;
     },
     previewImg(url) {
       this.$hevueImgPreview(url);
     },
-		clear(){
-			this.chatList = [];
-		},
+    clear() {
+      this.chatList = [];
+    },
     // 获取ai对话
     getAiContent(_uid) {
       let _source = new EventSource(`https://gpt4.cocorobo.cn/stream/${_uid}`); //http://gpt4.cocorobo.cn:8011/stream/     https://gpt4.cocorobo.cn/stream/
       let _allText = "";
       let _mdText = "";
-      const md = new MarkdownIt();
+      // const md = new MarkdownIt();
       _source.onmessage = _e => {
         if (_e.data.replace("'", "").replace("'", "") == "[DONE]") {
           //对话已经完成
@@ -216,6 +257,7 @@ export default {
           this.chatList.find(i => i.uid == _uid).isalltext = true;
           this.chatList.find(i => i.uid == _uid).isShowSynchronization = true;
           this.chatList.find(i => i.uid == _uid).loading = false;
+          this.nowChatList.push(this.chatList.find(i => i.uid == _uid));
           // 这里保存对话
           this.insertChat(_uid);
           return;
@@ -233,7 +275,7 @@ export default {
           _mdText = _mdText.replace(/\\/g, "");
           if (_allText.split("```").length % 2 == 0) _mdText += "\n```\n";
           //转化返回的回复流数据
-          _mdText = md.render(_mdText);
+          // _mdText = md.render(_mdText);
           this.chatList.find(i => i.uid == _uid).aiContent = _mdText;
           this.chatList.find(i => i.uid == _uid).loading = false;
           this.scrollBottom();
@@ -255,7 +297,7 @@ export default {
         alltext: _data.aiContent,
         type: "chat",
         filename: _data.filename,
-        session_name: `${this.courseId}-studyStudent` //这是对话记录位置
+        session_name: `${this.courseId}-studyStudent-md` //这是对话记录位置
       };
       this.ajax
         .post("https://gpt4.cocorobo.cn/insert_chat", params)
@@ -272,7 +314,7 @@ export default {
           userid: this.userid,
           groupid: "602def61-005d-11ee-91d8-005056b8q12w",
           // session_name:``
-          session_name: `${this.courseId}-studyStudent`
+          session_name: `${this.courseId}-studyStudent-md`
         };
         this.ajax
           .post("https://gpt4.cocorobo.cn/get_agent_park_chat", params)
@@ -332,8 +374,6 @@ export default {
       this.chatLoading = true;
       let _uuid = uuidv4();
 
-
-
       this.chatList.push({
         role: "user",
         content: `${_text}`,
@@ -348,7 +388,35 @@ export default {
         loading: true
       });
       this.scrollBottom();
-
+      let history = [];
+      this.nowChatList.forEach(i => {
+        if (i.content == "wanSearch") {
+          // history.push({
+          //   role: "assistant",
+          //   content: i.aiContent
+          // });
+          return;
+        } else if (i.content == "getImage") {
+          return history.push({
+            role: "assistant",
+            content: i.aiContent
+          });
+        }
+        if (i.content) {
+          history.push({
+            role: "user",
+            content: i.content
+          });
+        }
+        if (i.aiContent) {
+          history.push({
+            role: "assistant",
+            content: i.aiContent
+          });
+        }
+      });
+      history.push({ role: "user", content: _text });
+      // history.pop();
       let params = {
         model: "gpt-3.5-turbo",
         temperature: 0,
@@ -356,9 +424,9 @@ export default {
         top_p: 1,
         frequency_penalty: 0,
         presence_penalty: 0,
-        messages: [{ role: "user", content: _text }],
+        messages: history,
         uid: _uuid,
-        mind_map_question: ""
+        mind_map_question: _text
       };
       this.text = "";
 
@@ -393,8 +461,8 @@ Instruction: Based on the context, follow "Format example", write content.
 你的任务是根据用户的请求,结合以下“课程信息”包含的子条目(“课程标题”,“分类”以及“年级”),向用户输出相关的扩展知识点,将结果以有序列表的形式返回给用户。
 课程信息
 课程标题:${this.courseDetail.title}
-分类:${this.courseDetail.name?this.courseDetail.name:"无"}
-学生年级:${this.courseDetail.classname?this.courseDetail.classname:"无"}
+分类:${this.courseDetail.name ? this.courseDetail.name : "无"}
+学生年级:${this.courseDetail.classname ? this.courseDetail.classname : "无"}
 
 ## 规则
 1. 内容应该与“课程信息”相关,避免提供无关的信息。
@@ -428,8 +496,8 @@ Instruction: Based on the context, follow "Format example", write content.
 你的任务是根据用户的请求,结合以下“课程信息”包含的子条目(“课程标题”,“分类”以及“年级”),向用户输出相关的练习题目,将结果以有序列表的形式返回给用户。
 课程信息
 课程标题:${this.courseDetail.title}
-分类:${this.courseDetail.name?this.courseDetail.name:"无"}
-学生年级:${this.courseDetail.classname?this.courseDetail.classname:"无"}
+分类:${this.courseDetail.name ? this.courseDetail.name : "无"}
+学生年级:${this.courseDetail.classname ? this.courseDetail.classname : "无"}
 
 ## 规则
 1. 练习题目内容应该与“课程信息”相关,避免提供无关的信息。
@@ -464,8 +532,8 @@ Instruction: Based on the context, follow "Format example", write content.
 你的任务是根据用户的请求,结合以下“课程信息”包含的子条目(“课程标题”,“主题”,“学科”,“年级”以及“学习内容”),对课程进行课程总结,请根据输出格式将内容输出给用户。
 课程信息
 课程标题:${this.courseDetail.title}
-分类:${this.courseDetail.name?this.courseDetail.name:"无"}
-学生年级:${this.courseDetail.classname?this.courseDetail.classname:"无"}
+分类:${this.courseDetail.name ? this.courseDetail.name : "无"}
+学生年级:${this.courseDetail.classname ? this.courseDetail.classname : "无"}
 学习内容:${this.exportCourse()}
 
 ## 规则
@@ -507,6 +575,38 @@ Instruction: Based on the context, follow "Format example", write content.
         is_mind_map: false,
         loading: true
       });
+      let history = [];
+      this.nowChatList.forEach(i => {
+        if (i.content == "wanSearch") {
+          // history.push({
+          //   role: "assistant",
+          //   content: JSON.stringify(i.aiContent)
+          // });
+          return;
+        } else if (i.content == "getImage") {
+          return history.push({
+            role: "assistant",
+            content: i.aiContent
+          });
+        }
+        if (i.content) {
+          history.push({
+            role: "user",
+            content: i.content
+          });
+        }
+        if (i.aiContent) {
+          history.push({
+            role: "assistant",
+            content: i.aiContent
+          });
+        }
+      });
+      // history.pop();
+      if (_msg) {
+        history.push({ role: "user", content: _msg });
+      }
+      // history.push({ role: "user", content: _text });
       this.scrollBottom();
 
       let params = {
@@ -516,9 +616,9 @@ Instruction: Based on the context, follow "Format example", write content.
         top_p: 1,
         frequency_penalty: 0,
         presence_penalty: 0,
-        messages: [{ role: "user", content: _msg }],
+        messages: history,
         uid: _uuid,
-        mind_map_question: ""
+        mind_map_question: _text
       };
       this.text = "";
 
@@ -554,6 +654,7 @@ Instruction: Based on the context, follow "Format example", write content.
     this.getChatList().then(_ => {
       this.scrollBottom();
     });
+    this.nowChatList = [];
   }
 };
 </script>
@@ -564,7 +665,13 @@ Instruction: Based on the context, follow "Format example", write content.
   height: 100%;
   box-sizing: border-box;
 }
-
+.aiCopy {
+  position: absolute;
+  right: 5px;
+  bottom: 0%;
+  /* transform: translate(0, -30%); */
+  cursor: pointer;
+}
 .taskTop {
   width: 100%;
   height: 280px;
@@ -743,6 +850,7 @@ Instruction: Based on the context, follow "Format example", write content.
   margin-top: 10px;
   box-sizing: border-box;
   padding-right: 35px;
+  position: relative;
 }
 
 .t_t_c_a_right {

+ 18 - 3
src/components/classRoomHelper/index.vue

@@ -34,7 +34,17 @@
           </el-tooltip>
         </div>
 
-        <div @click="$emit('authority')">
+        <div @click="$emit('review')">
+          <el-tooltip class="item" effect="dark" content="评论" placement="top">
+            <img
+              :src="require('../../assets/icon/course/comment.png')"
+              alt=""
+              style="width: 22px;height: 22px;"
+            />
+          </el-tooltip>
+        </div>
+
+        <div @click="$emit('authority')" v-if="tType==1">
           <el-tooltip class="item" effect="dark" content="权限" placement="top">
             <img
               :src="require('../../assets/icon/course/setting.png')"
@@ -142,7 +152,7 @@ import searchArea from "./component/searchArea.vue";
 import taskArea from "./component/taskArea.vue";
 import dialogArea from "./component/dialogArea.vue";
 export default {
-  emits: ["refresh", "goStep", "backPage", "authority"],
+  emits: ["refresh", "goStep", "backPage", "authority", "review"],
   components: {
     searchArea,
     taskArea,
@@ -152,7 +162,11 @@ export default {
     courseDetail: {
       type: Object,
       default: () => {}
-    }
+    },
+		tType:{
+			type:Number,
+			default:0,
+		}
   },
   data() {
     return {
@@ -205,6 +219,7 @@ export default {
   right: 20px;
   overflow: hidden;
   display: flex;
+  top: 20px;
 }
 
 .ch_nav_box {

+ 15 - 0
src/components/courseDetail.vue

@@ -226,6 +226,9 @@
               <span :class="{ active: type == 1 }" @click="getCTwo"
                 >课程分析</span
               >
+              <span :class="{ active: type == 3 }" @click="getCThree"
+                >课程评价</span
+              >
             </div>
             <div
               v-if="((tType == 1 || tType == 4) && type == 2) || tType == 2"
@@ -991,6 +994,13 @@
                 {{ '时间:' + item + '次数:' + chaptersJson.time[item] }}</div> -->
               <!-- <div>实施时间:{{ chaptersJson.startTime }}</div> -->
             </div>
+            <div
+              v-if="(type == 3)"
+              :class="courseDetail.brief != '' ? 'rightTd' : 'noBRight'"
+              style="width: 100%; padding-top: 20px"
+            >
+              <scoreZong :courseid="id"></scoreZong>
+            </div>
           </div>
         </div>
 
@@ -1078,6 +1088,7 @@ import { tools } from "../common/tools";
 import axios from "axios";
 import JSZip from "jszip";
 import FileSaver from "file-saver";
+import scoreZong from './scoreZong/get.vue'
 
 const getFile = (url) => {
   return new Promise((resolve, reject) => {
@@ -1133,6 +1144,7 @@ export default {
   components: {
     Heatmap,
     Group,
+    scoreZong
   },
   data() {
     return {
@@ -1628,6 +1640,9 @@ export default {
       this.type = 1;
       this.getCourseDetail2();
     },
+    getCThree(){
+      this.type = 3
+    },
     getCourseDetail2() {
       const loading = this.$loading.service({
         background: "rgba(255, 255, 255, 0.7)",

+ 57 - 14
src/components/easy2/studyStudent.vue

@@ -10,8 +10,7 @@
         box-sizing: border-box;
       "
     >
-      <div class="btnAllNT">
-        <!-- <img src="../../assets/icon/learn/screen.png" @click="allScrell" /> -->
+      <!-- <div class="btnAllNT">
         <img
           v-if="
                 courseDetail.userid == userid ||
@@ -51,7 +50,7 @@
             )
           "
         />
-      </div>
+      </div> -->
       <div
         class="pButton"
         style="left: 0; top: 140px"
@@ -225,9 +224,9 @@
           </div>
         </div>
       </div>
-      <div class="body_student" :class="{ navLeftCss: !mlDialog }">
-        <div class="new_topFixed"></div>
-        <div class="new_top" :class="{ navLeftCss: !mlDialog }">
+      <div class="body_student" :style="{width: mlDialog ? 'calc(100% - '+classRoomHelperWidth+' - 20% - 40px)' : 'calc(100% - '+classRoomHelperWidth+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }">
+        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+classRoomHelperWidth+' - 20% - 40px)' : 'calc(100% - '+classRoomHelperWidth+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }"></div>
+        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+classRoomHelperWidth+' - 20% - 40px)' : 'calc(100% - '+classRoomHelperWidth+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }">
           <div class="courseIndex">
             <div>任务{{ taskCount + 1 }}</div>
             <el-tooltip
@@ -245,7 +244,7 @@
               </div>
             </el-tooltip>
           </div>
-          <div class="btnAll">
+          <div class="btnAll" v-show="!['1973f6c7-1561-11ee-91d8-005056b86db5','777559d2-7239-11ee-b98c-005056b86db5','884c5665-a453-46f3-b7b6-01d575290aa9'].includes(org)">
             <div class="btnLeft">
               <el-tooltip effect="light" content="刷新" placement="top">
                 <div class="reBtnIcon" @click="refreshCourse">
@@ -8041,6 +8040,23 @@
         </el-dialog>
       </div>
     </div>
+		<!-- v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'" -->
+		<classRoomHelper v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'" ref="classRoomHelperRef" :courseDetail="courseDetail" :tType="2" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
+                    '/courseDetail?userid=' +
+                      userid +
+                      '&oid=' +
+                      oid +
+                      '&org=' +
+                      org +
+                      '&cid=' +
+                      classId +
+                      '&courseId=' +
+                      id +
+                      '&tType=' +
+                      tType +
+                      '&screenType=' +
+                      screenType
+                  )"></classRoomHelper>
     <div
       class="pButton"
       @click="(pzDialog = true), selectPz()"
@@ -8050,21 +8066,23 @@
       <!-- 批 -->
       <img src="../../assets/mlBtn.png" style="width: 25px" alt="" />
     </div>
-    <div v-if="pzDialog == true" class="newDialogCss">
+    <div v-if="pzDialog == true" class="newDialogCss" :style="`right:${commentRight}`">
       <div class="pzTop2">
         <!-- <div>评论</div>
         <div @click="pzDialog = false">
           <img src="../../assets/close1.png" alt="" />
         </div> -->
         <div class="checkbox">
-           <!-- <div class="check" style="font-size: 25px; position: unset">
+          <!-- <div class="check" style="font-size: 25px; position: unset">
             评论
           </div> -->
 					<div class="cb-tabList">
 						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
-						<div :class="[commentTagShow==1?'cb-tabItem':'']" @click="commentTagShow=1">评分</div>
+						<!-- <div :class="[commentTagShow==1?'cb-tabItem':'']" @click="commentTagShow=1">评分</div> -->
+            <!-- v-show="oid == '4c686762-1d0a-11ed-8c78-005056b86db5'" -->
+						<div :class="[commentTagShow==2?'cb-tabItem':'']" @click="commentTagShow=2">总评</div>
 					</div>
-          <el-select v-model="pzStype" @change="selectPz" class="selectBox">
+          <el-select v-model="pzStype" @change="selectPz" class="selectBox" v-show="commentTagShow == 0">
             <el-option label="时间降序" :value="1"></el-option>
             <el-option label="时间升序" :value="2"></el-option>
             <el-option label="我的评课" :value="3"></el-option>
@@ -8169,6 +8187,9 @@
 			<div class="scoreList" v-if="commentTagShow==1">
 				<scoreItem v-for="item in scoreList.datalist" @refresh="getScoreList" :data="item" :isScore="scoreList.isScoreList.filter(i=>(i.userid==item.userid && i.courseid == item.courseId))" :key="item.courseId"/>
 			</div>
+      <div class="scoreList" v-if="commentTagShow==2" style="position: relative">
+        <scoreZong :courseid="id" :userid="userid"></scoreZong>
+			</div>
     </div>
     <div
       v-if="toolDialogVisible == true"
@@ -11881,6 +11902,8 @@ import EnglishVoice from '../EnglishVoice2/index.vue'
 import checkEnglishVoice from '../checkEnglishVoice/index.vue'
 import correctText from '../components/correctText.vue'
 import scoreItem from '../scoreList/scoreItem.vue'
+import scoreZong from '../scoreZong/index.vue'
+import classRoomHelper from '../classRoomHelper/index.vue'
 
 const getFile = (url) => {
   return new Promise((resolve, reject) => {
@@ -11954,7 +11977,9 @@ export default {
     EnglishVoice,
     checkEnglishVoice,
 		correctText,
-		scoreItem
+		scoreItem,
+		classRoomHelper,
+    scoreZong
   },
   data() {
     return {
@@ -12319,6 +12344,7 @@ export default {
 				listdata:[],
 				isScoreList:[],	
 			},
+			classRoomHelperWidth: '85px'
     };
   },
   methods: {
@@ -19807,6 +19833,9 @@ export default {
       }
       // console.log(_url)
       return _url 
+    },
+		setClassRoomHelperWidth(width){
+      this.classRoomHelperWidth = width
     }
   },
   directives: {
@@ -19866,6 +19895,19 @@ export default {
           : "";
       };
     },
+		commentRight(){
+			if(!['1973f6c7-1561-11ee-91d8-005056b86db5','777559d2-7239-11ee-b98c-005056b86db5','884c5665-a453-46f3-b7b6-01d575290aa9'].includes(this.org)){
+				return "35px";
+			}
+			return `calc(${this.classRoomHelperWidth} + 5px)`
+			// if(this.$refs["classRoomHelperRef"].type==0){
+			// 	return "100px";
+			// }else if(this.$refs["classRoomHelperRef"].type==1){
+			// 	return "502px"
+			// }else{
+			// 	return "0px"
+			// }
+		},
     checkUpload() {
       return function () {
         var studentK = [];
@@ -19976,7 +20018,8 @@ export default {
         .catch((err) => {
           console.error(err);
         });
-		}
+		},
+		
   },
   mounted() {
     document.body.addEventListener("click", (e) => {
@@ -22682,7 +22725,7 @@ export default {
 .pzTop2 .checkbox {
   display: flex;
   align-items: center;
-  padding: 5px 30px;
+  padding: 5px 10px;
   flex: 0 0 auto;
   font-weight: bold;
   border-bottom: 1px solid #eee;

+ 56 - 13
src/components/easy3/studyStudent.vue

@@ -10,8 +10,7 @@
         box-sizing: border-box;
       "
     >
-      <div class="btnAllNT">
-        <!-- <img src="../../assets/icon/learn/screen.png" @click="allScrell" /> -->
+      <!-- <div class="btnAllNT">
         <img
         v-if="
                 courseDetail.userid == userid ||
@@ -51,7 +50,7 @@
             )
           "
         />
-      </div>
+      </div> -->
       <div
         class="pButton"
         style="left: 0; top: 140px"
@@ -225,9 +224,9 @@
           </div>
         </div>
       </div>
-      <div class="body_student" :class="{ navLeftCss: !mlDialog }">
-        <div class="new_topFixed"></div>
-        <div class="new_top" :class="{ navLeftCss: !mlDialog }">
+      <div class="body_student":style="{width: mlDialog ? 'calc(100% - '+classRoomHelperWidth+' - 20% - 40px)' : 'calc(100% - '+classRoomHelperWidth+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }">
+        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+classRoomHelperWidth+' - 20% - 40px)' : 'calc(100% - '+classRoomHelperWidth+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }"></div>
+        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+classRoomHelperWidth+' - 20% - 40px)' : 'calc(100% - '+classRoomHelperWidth+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }">
           <div class="courseIndex">
             <div>任务{{ taskCount + 1 }}</div>
             <el-tooltip
@@ -245,7 +244,8 @@
               </div>
             </el-tooltip>
           </div>
-          <div class="btnAll">
+					<!-- v-show="org !== '1973f6c7-1561-11ee-91d8-005056b86db5' || org !== '777559d2-7239-11ee-b98c-005056b86db5'" -->
+          <div class="btnAll" v-show="!['1973f6c7-1561-11ee-91d8-005056b86db5','777559d2-7239-11ee-b98c-005056b86db5','884c5665-a453-46f3-b7b6-01d575290aa9'].includes(org)">
             <div class="btnLeft">
               <el-tooltip effect="light" content="刷新" placement="top">
                 <div class="reBtnIcon" @click="refreshCourse">
@@ -8028,6 +8028,23 @@
         </el-dialog>
       </div>
     </div>
+				<!-- v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'" -->
+		<classRoomHelper v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'" ref="classRoomHelperRef" :courseDetail="courseDetail" :tType="3" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
+                    '/courseDetail?userid=' +
+                      userid +
+                      '&oid=' +
+                      oid +
+                      '&org=' +
+                      org +
+                      '&cid=' +
+                      classId +
+                      '&courseId=' +
+                      id +
+                      '&tType=' +
+                      tType +
+                      '&screenType=' +
+                      screenType
+                  )"></classRoomHelper>
     <div
       class="pButton"
       @click="(pzDialog = true), selectPz()"
@@ -8037,7 +8054,7 @@
       <!-- 批 -->
       <img src="../../assets/mlBtn.png" style="width: 25px" alt="" />
     </div>
-    <div v-if="pzDialog == true" class="newDialogCss">
+    <div v-if="pzDialog == true" class="newDialogCss" :style="`right:${commentRight}`">
       <div class="pzTop2">
         <!-- <div>评论</div>
         <div @click="pzDialog = false">
@@ -8049,9 +8066,11 @@
           </div> -->
 					<div class="cb-tabList">
 						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
-						<div :class="[commentTagShow==1?'cb-tabItem':'']" @click="commentTagShow=1">评分</div>
+						<!-- <div :class="[commentTagShow==1?'cb-tabItem':'']" @click="commentTagShow=1">评分</div> -->
+            <!-- v-show="oid == '4c686762-1d0a-11ed-8c78-005056b86db5'" -->
+						<div :class="[commentTagShow==2?'cb-tabItem':'']" @click="commentTagShow=2">总评</div>
 					</div>
-          <el-select v-model="pzStype" @change="selectPz" class="selectBox">
+          <el-select v-model="pzStype" @change="selectPz" class="selectBox" v-show="commentTagShow == 0">
             <el-option label="时间降序" :value="1"></el-option>
             <el-option label="时间升序" :value="2"></el-option>
             <el-option label="我的评课" :value="3"></el-option>
@@ -8156,6 +8175,9 @@
 			<div class="scoreList" v-if="commentTagShow==1">
 				<scoreItem v-for="item in scoreList.datalist" @refresh="getScoreList" :data="item" :isScore="scoreList.isScoreList.filter(i=>(i.userid==item.userid && i.courseid == item.courseId))" :key="item.courseId"/>
 			</div>
+      <div class="scoreList" v-if="commentTagShow==2" style="position: relative">
+        <scoreZong :courseid="id" :userid="userid"></scoreZong>
+			</div>
     </div>
     <div
       v-if="toolDialogVisible == true"
@@ -11872,6 +11894,8 @@ import EnglishVoice from '../EnglishVoice2/index.vue'
 import checkEnglishVoice from '../checkEnglishVoice/index.vue'
 import correctText from '../components/correctText.vue'
 import scoreItem from '../scoreList/scoreItem.vue'
+import scoreZong from '../scoreZong/index.vue'
+import classRoomHelper from '../classRoomHelper/index.vue'
 
 const getFile = (url) => {
   return new Promise((resolve, reject) => {
@@ -11945,7 +11969,9 @@ export default {
     EnglishVoice,
     checkEnglishVoice,
 		correctText,
-		scoreItem
+		scoreItem,
+		classRoomHelper,
+    scoreZong
   },
   data() {
     return {
@@ -12311,6 +12337,7 @@ export default {
 				listdata:[],
 				isScoreList:[],	
 			},
+			classRoomHelperWidth: '85px'
     };
   },
   methods: {
@@ -19823,7 +19850,10 @@ export default {
         .catch((err) => {
           console.error(err);
         });
-		}
+		},
+		setClassRoomHelperWidth(width){
+      this.classRoomHelperWidth = width
+    }
   },
   directives: {
     // 使用局部注册指令的方式
@@ -19882,6 +19912,19 @@ export default {
           : "";
       };
     },
+		commentRight(){
+			if(!['1973f6c7-1561-11ee-91d8-005056b86db5','777559d2-7239-11ee-b98c-005056b86db5','884c5665-a453-46f3-b7b6-01d575290aa9'].includes(this.org)){
+				return "35px";
+			}
+			return `calc(${this.classRoomHelperWidth} + 5px)`
+			// if(this.$refs["classRoomHelperRef"].type==0){
+			// 	return "100px";
+			// }else if(this.$refs["classRoomHelperRef"].type==1){
+			// 	return "502px"
+			// }else{
+			// 	return "0px"
+			// }
+		},
     checkUpload() {
       return function () {
         var studentK = [];
@@ -22684,7 +22727,7 @@ export default {
 .pzTop2 .checkbox {
   display: flex;
   align-items: center;
-  padding: 5px 30px;
+  padding: 5px 10px;
   flex: 0 0 auto;
   font-weight: bold;
   border-bottom: 1px solid #eee;

+ 33 - 4
src/components/index.vue

@@ -92,7 +92,14 @@
                   " alt="" />
                 </div>
                 <div class="middle_white">
-                  <div class="textOverflow">{{ item.title }}</div>
+                  <div class="textOverflow">
+                    <el-tooltip effect="light" :content="item.title" placement="top">
+                      <span class="utitle">{{ item.title }}</span>
+                    </el-tooltip>
+                    <el-tooltip effect="light" :content="item.uname" placement="top">
+                      <span class="uname">{{ item.uname }}</span>
+                    </el-tooltip>
+                  </div>
                   <div class="nameAndLength">
                     <el-tooltip class="typeN" effect="light" :content="item.typename" placement="top">
                       <div>{{ item.typename }}</div>
@@ -161,7 +168,14 @@
                       " alt="" />
                     </div>
                     <div class="middle_white">
-                      <div class="textOverflow">{{ item.title }}</div>
+                      <div class="textOverflow">
+                        <el-tooltip effect="light" :content="item.title" placement="top">
+                          <span class="utitle">{{ item.title }}</span>
+                        </el-tooltip>
+                        <el-tooltip effect="light" :content="item.uname" placement="top">
+                          <span class="uname">{{ item.uname }}</span>
+                        </el-tooltip>
+                      </div>
                       <div class="nameAndLength">
                         <el-tooltip class="typeN" effect="light" :content="item.typename" placement="top">
                           <div>{{ item.typename }}</div>
@@ -1030,12 +1044,27 @@ export default {
 
 .textOverflow {
   padding: 0 5px 0 0px;
-  width: 95%;
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 16px;
+}
+
+.textOverflow > .utitle{
+  max-width: calc(100% - 100px);
   overflow: hidden;
   white-space: nowrap;
   text-overflow: ellipsis;
   font-weight: bold;
-  font-size: 16px;
+  display: block;
+}
+.textOverflow > .uname{
+  max-width: 90px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  display: block;
 }
 
 .student_page {

+ 285 - 0
src/components/scoreZong/get.vue

@@ -0,0 +1,285 @@
+<template>
+    <div class="sz_body" v-loading="loading">
+        <div style="font-size: 18px;margin-bottom: 20px;">评分人数:<span class="color">{{ num }}</span>人  总平均分:<span class="color">{{ num ? score ? (score / num).toFixed(1) : 0 : 0 }}</span></div>
+        <div class="test_box" v-for="(item, index) in testList" :key="index">
+            <div class="testTitle">{{ item.title }}</div>
+            <div class="testContent" v-if="item.type == '1'" v-for="(item2, index2) in item.array"
+                :key="index + '-' + index2">
+                <div class="testContent_title">{{ index2 + 1 }}、{{ item2.title }}</div>
+                <div class="testContent_input">
+                    <!-- <el-input v-model="item2.uscore" class="c_input" @change="numberPan(index, index2, item2.score)"
+                        placeholder="请输入评分" /> -->
+                    <span>平均分:</span>
+                    <span class="color">{{ num ? item2.uscore ? (item2.uscore / num).toFixed(2) : 0 : 0 }}</span>
+                </div>
+            </div>
+            <div v-if="item.type == '2'">
+                <div class="test_ping" v-for="(answer, index2) in item.answerArray" :key="index + '-' + index2">
+                    <span style="    min-width: fit-content;">{{ index2 + 1  }}.</span>
+                    <span>{{ answer  }}</span>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        courseid: {
+            type: String,
+            default: ''
+        },
+        userid: {
+            type: String,
+            default: ''
+        },
+    },
+    data() {
+        return {
+            testList: [
+                {
+                    title: '教学目标(5分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '目标结构完整,能够清晰地表达学生的学习过程与预期成果。目标符合学情,具有可行性与逻辑递进性。目标体现学生本位与素养导向,不单纯停留在知识与技能层面。',
+                            score: 5,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学内容(5分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '重难点突出,符合课标与教材要求,不超纲。符合学情特点,贴近学生生活,体现积极向上的育人价值观。关注学生学习的最近发展区,有意识地展现因材施教的意图。',
+                            score: 5,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学内容(30分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '课堂结构合理、紧密,层次清楚,突出重难点的解决。(10分)',
+                            score: 10,
+                            uscore: 0,
+                        },
+                        {
+                            title: '强调“学”的活动设计,教与学有机结合。(10分)',
+                            score: 10,
+                            uscore: 0,
+                        },
+                        {
+                            title: '课堂管理有序,教学语言清晰准确,能及时、合理地解决课堂问题,体现良好的教学素养。(10分)',
+                            score: 10,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学方法与策略(20分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '符合教学内容与学科特点。落实有效,能体现出学生的学习成效,不流于形式。具有一定的新意,展现教师的独立思考与探究意识。',
+                            score: 20,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学工具(15分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '合理、科学地使用信息化技术、学习单、自制教学道具、辅助性资源等教学工具。',
+                            score: 15,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学评价(10分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '重视评价,有合理的评价手段与工具。评价落实有效,体现针对性和专业性。',
+                            score: 10,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '创新意识(10分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '教学空间的选择、布置有独特想法,且合理有效。敢于尝试多样化的教学形式,如主题式、大单元、项目式、游戏化等。开发特色有效的教学策略与手段,如小组合作探究、跨学科展演等,教师特色鲜明。',
+                            score: 10,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学效果(5分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '达成目标,整个过程有资源的生成。学习过程中学生有满足、成功与喜悦等体验,对后续学习更有信心,能力得到发展。',
+                            score: 5,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '加分项(10分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '某项优点特别突出,如教学风貌、教学理念、教学特色、教学手段等,酌情加5-10分。',
+                            score: 10,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '评语',
+                    type: '2',
+                    answer: '',
+                    answerArray: [],
+
+                },
+            ],
+            num: 0,
+            score: 0,
+            loading: false
+        }
+    },
+    mounted () {
+        this.getList();
+    },
+    methods: {
+        numberPan(index, index2, score) {
+            let _score = this.testList[index].array[index2].uscore
+            if (/[^\d]/.test(_score) || _score < 0) {
+                this.$message.error('请输入大于0的整数')
+                this.testList[index].array[index2].uscore = 0
+            }
+            if (parseInt(_score) > parseInt(score)) {
+                this.$message.error('不能输入大于得分的整数')
+                this.testList[index].array[index2].uscore = score
+            }
+            this.$forceUpdate();
+        },
+        confirm() {
+            let params = [
+                {
+                    cid: this.courseid,
+                    uid: this.userid,
+                    json: JSON.stringify(this.testList),
+                },
+            ];
+            this.ajax
+                .post(this.$store.state.api + "opCourseScore", params)
+                .then((res) => {
+                    console.log(res.data);
+                    this.$message({
+                        message: "添加成功",
+                        type: "success",
+                    });
+                    this.getList();
+                    this.$forceUpdate();
+                })
+                .catch((err) => {
+                    console.error(err);
+                });
+        },
+        getList() {
+            let params =
+            {
+                cid: this.courseid,
+            };
+            this.loading = true
+            this.ajax
+                .get(this.$store.state.api + "getCourseScore", params)
+                .then((res) => {
+                    console.log(res.data);
+                    if(res.data[0].length > 0){
+                        // this.testList = JSON.parse(res.data[0][0].json)
+                        let data = res.data[0]
+                        this.num = data.length
+                        let sum = 0
+                        for(var i = 0; i < data.length; i++){
+                            let item = data[i]
+                            let _json = JSON.parse(item.json)
+                            for(var j = 0; j < this.testList.length; j++){
+                                let test = this.testList[j]
+                                if(test.type == '2'){
+                                    if(_json[j].answer){
+                                        test.answerArray.push(_json[j].answer)
+                                    }
+                                }else{
+                                    for(var k = 0; k < test.array.length; k++){
+                                        let _item = test.array[k]
+                                        _item.uscore += _item.score / 5 * parseInt(_json[j].array[k].uscore)
+                                        _item.num++
+                                        sum += _item.score / 5 * parseInt(_json[j].array[k].uscore)
+                                    }
+                                } 
+                            }
+                        }
+                        this.score = sum
+                    }
+                    this.loading = false
+                    this.$forceUpdate();
+                })
+                .catch((err) => {
+                    this.loading = false
+                    console.error(err);
+                });
+        }
+    },
+}
+</script>
+
+<style scoped>
+.sz_body {
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+}
+
+.test_box {
+    margin-bottom: 20px;
+}
+
+.testTitle {
+    font-size: 16px;
+    font-weight: 600;
+}
+
+.testContent {}
+
+.testContent_title {
+    margin-top: 10px;
+}
+
+.testContent_input {
+    margin-top: 5px;
+}
+
+.test_ping{
+    margin-top: 5px;
+    display: flex;
+    word-break: break-all;
+}
+
+.color{
+    color:#3681fc;
+}
+</style>

+ 315 - 0
src/components/scoreZong/index.vue

@@ -0,0 +1,315 @@
+<template>
+    <div class="sz_body" v-loading="loading" style="position: unset !important;">
+        <div class="test_box" v-for="(item, index) in testList" :key="index">
+            <div class="testTitle">{{ item.title }}</div>
+            <div class="testContent" v-if="item.type == '1'" v-for="(item2, index2) in item.array"
+                :key="index + '-' + index2">
+                <div class="testContent_title">{{ index2 + 1 }}、{{ item2.title }}</div>
+                <div class="testContent_input">
+                    <!-- <el-input v-model="item2.uscore" class="c_input" @change="numberPan(index, index2, item2.score)"
+                        placeholder="请输入评分" /> -->
+                    <el-rate v-model="item2.uscore" :allow-half="false" class="custom-rate"></el-rate>
+                    
+                </div>
+            </div>
+            <div v-if="item.type == '2'">
+                <textarea rows="8" class="binfo_input binfo_textarea" cols v-model="item.answer"
+                    placeholder="你还有哪些补充"></textarea>
+            </div>
+        </div>
+        <div class="btn">
+            <el-button type="primary" size="default" @click="confirm">提交</el-button>
+
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        courseid: {
+            type: String,
+            default: ''
+        },
+        userid: {
+            type: String,
+            default: ''
+        },
+    },
+    data() {
+        return {
+            testList: [
+                {
+                    title: '教学目标(5分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '目标结构完整,能够清晰地表达学生的学习过程与预期成果。目标符合学情,具有可行性与逻辑递进性。目标体现学生本位与素养导向,不单纯停留在知识与技能层面。',
+                            score: 5,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学内容(5分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '重难点突出,符合课标与教材要求,不超纲。符合学情特点,贴近学生生活,体现积极向上的育人价值观。关注学生学习的最近发展区,有意识地展现因材施教的意图。',
+                            score: 5,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学内容(30分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '课堂结构合理、紧密,层次清楚,突出重难点的解决。(10分)',
+                            score: 10,
+                            uscore: 0,
+                        },
+                        {
+                            title: '强调“学”的活动设计,教与学有机结合。(10分)',
+                            score: 10,
+                            uscore: 0,
+                        },
+                        {
+                            title: '课堂管理有序,教学语言清晰准确,能及时、合理地解决课堂问题,体现良好的教学素养。(10分)',
+                            score: 10,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学方法与策略(20分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '符合教学内容与学科特点。落实有效,能体现出学生的学习成效,不流于形式。具有一定的新意,展现教师的独立思考与探究意识。',
+                            score: 20,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学工具(15分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '合理、科学地使用信息化技术、学习单、自制教学道具、辅助性资源等教学工具。',
+                            score: 15,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学评价(10分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '重视评价,有合理的评价手段与工具。评价落实有效,体现针对性和专业性。',
+                            score: 10,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '创新意识(10分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '教学空间的选择、布置有独特想法,且合理有效。敢于尝试多样化的教学形式,如主题式、大单元、项目式、游戏化等。开发特色有效的教学策略与手段,如小组合作探究、跨学科展演等,教师特色鲜明。',
+                            score: 10,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '教学效果(5分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '达成目标,整个过程有资源的生成。学习过程中学生有满足、成功与喜悦等体验,对后续学习更有信心,能力得到发展。',
+                            score: 5,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '加分项(10分)',
+                    type: '1',
+                    array: [
+                        {
+                            title: '某项优点特别突出,如教学风貌、教学理念、教学特色、教学手段等,酌情加5-10分。',
+                            score: 10,
+                            uscore: 0,
+                        }
+                    ],
+                },
+                {
+                    title: '评语',
+                    type: '2',
+                    answer: ''
+                },
+            ],
+            loading: false
+        }
+    },
+    mounted () {
+        this.getList();
+    },
+    methods: {
+        numberPan(index, index2, score) {
+            let _score = this.testList[index].array[index2].uscore
+            if (/[^\d]/.test(_score) || _score < 0) {
+                this.$message.error('请输入大于0的整数')
+                this.testList[index].array[index2].uscore = 0
+            }
+            if (parseInt(_score) > parseInt(score)) {
+                this.$message.error('不能输入大于得分的整数')
+                this.testList[index].array[index2].uscore = score
+            }
+            this.$forceUpdate();
+        },
+        confirm() {
+            let params = [
+                {
+                    cid: this.courseid,
+                    uid: this.userid,
+                    json: JSON.stringify(this.testList),
+                },
+            ];
+            this.ajax
+                .post(this.$store.state.api + "opCourseScore", params)
+                .then((res) => {
+                    console.log(res.data);
+                    this.$message({
+                        message: "添加成功",
+                        type: "success",
+                    });
+                    this.getList();
+                    this.$forceUpdate();
+                })
+                .catch((err) => {
+                    console.error(err);
+                });
+        },
+        getList() {
+            let params =
+            {
+                cid: this.courseid,
+                uid: this.userid,
+            };
+            this.loading = true
+            this.ajax
+                .get(this.$store.state.api + "getCourseScoreP", params)
+                .then((res) => {
+                    console.log(res.data);
+                    if(res.data[0].length > 0){
+                        this.testList = JSON.parse(res.data[0][0].json)
+                    }
+                    this.loading = false
+                    this.$forceUpdate();
+                })
+                .catch((err) => {
+                    this.loading = false
+                    console.error(err);
+                });
+        }
+    },
+}
+</script>
+
+<style scoped>
+.sz_body {
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+}
+
+.test_box {
+    margin-bottom: 20px;
+}
+
+.testTitle {
+    font-size: 16px;
+    font-weight: 600;
+}
+
+.testContent {}
+
+.testContent_title {
+    margin-top: 10px;
+}
+
+.testContent_input {
+    margin-top: 5px;
+}
+
+.c_input {
+    width: 120px;
+}
+
+.binfo_input {
+    width: 100%;
+    margin: 0;
+    padding: 12px 14px;
+    display: block;
+    min-width: 0;
+    outline: none;
+    box-sizing: border-box;
+    background: none;
+    border: none;
+    border-radius: 4px;
+    background: #fff;
+    font-size: 16px;
+    resize: none;
+    font-family: "Microsoft YaHei";
+    min-height: 48px;
+    /* border: 1px solid #3682fc00; */
+    border: 1.5px solid #cad1dc;
+    margin-top: 10px;
+}
+
+.binfo_textarea {
+    border: 1.5px solid #cad1dc;
+    font-size: 16px;
+    resize: none;
+    /* background: #f6f6f6; */
+    font-family: "Microsoft YaHei";
+}
+
+.binfo_input:focus-visible {
+    border: 1.5px solid #3681fc !important;
+}
+
+.btn {
+    text-align: right;
+    position: sticky;
+    left: 0;
+    bottom: 15px;
+    width: fit-content;
+    display: flex;
+    justify-content: flex-end;
+    margin-left: calc(100% - 80px);
+}
+
+.custom-rate{
+    height: auto;
+    margin-top: 10px;
+}
+
+.custom-rate >>> .el-rate__icon {
+  font-size: 28px;
+  margin-right: 5px;
+}
+.custom-rate >>> .el-icon-star-on:before{
+  font-size: 32px;
+}
+
+.custom-rate >>> .el-rate__icon.hover{
+    transform: scale(1);
+}
+</style>

+ 24 - 12
src/components/studyStudent.vue

@@ -257,7 +257,7 @@
               </div>
             </el-tooltip>
           </div>
-          <div class="btnAll" v-show="org !== '1973f6c7-1561-11ee-91d8-005056b86db5' || org !== '777559d2-7239-11ee-b98c-005056b86db5'">
+          <div class="btnAll"  v-show="!['1973f6c7-1561-11ee-91d8-005056b86db5','777559d2-7239-11ee-b98c-005056b86db5','884c5665-a453-46f3-b7b6-01d575290aa9'].includes(org)"><!--v-show="org !== '1973f6c7-1561-11ee-91d8-005056b86db5' || org !== '777559d2-7239-11ee-b98c-005056b86db5'"-->
             <div class="btnLeft">
               <el-tooltip effect="light" content="刷新" placement="top">
                 <div class="reBtnIcon" @click="refreshCourse">
@@ -8037,7 +8037,8 @@
           </div>
         </el-dialog>
       </div>
-      <classRoomHelper v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5'" ref="classRoomHelperRef" :courseDetail="courseDetail" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @backPage="goTo(
+			<!-- v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'" -->
+      <classRoomHelper v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'"  ref="classRoomHelperRef" :courseDetail="courseDetail" :tType='1' @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
                     '/courseDetail?userid=' +
                       userid +
                       '&oid=' +
@@ -8075,9 +8076,11 @@
           </div> -->
 					<div class="cb-tabList">
 						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
-						<div :class="[commentTagShow==1?'cb-tabItem':'']" @click="commentTagShow=1">评分</div>
+						<!-- <div :class="[commentTagShow==1?'cb-tabItem':'']" @click="commentTagShow=1">评分</div> -->
+            <!-- v-show="oid == '4c686762-1d0a-11ed-8c78-005056b86db5'" -->
+						<div :class="[commentTagShow==2?'cb-tabItem':'']" @click="commentTagShow=2">总评</div>
 					</div>
-          <el-select v-model="pzStype" @change="selectPz" class="selectBox">
+          <el-select v-model="pzStype" @change="selectPz" class="selectBox" v-show="commentTagShow == 0">
             <el-option label="时间降序" :value="1"></el-option>
             <el-option label="时间升序" :value="2"></el-option>
             <el-option label="我的评课" :value="3"></el-option>
@@ -8182,6 +8185,9 @@
 			<div class="scoreList" v-if="commentTagShow==1">
 				<scoreItem v-for="item in scoreList.datalist" @refresh="getScoreList" :data="item" :isScore="scoreList.isScoreList.filter(i=>(i.userid==item.userid && i.courseid == item.courseId))" :key="item.courseId"/>
 			</div>
+			<div class="scoreList" v-if="commentTagShow==2" style="position: relative">
+        <scoreZong :courseid="id" :userid="userid"></scoreZong>
+			</div>
     </div>
     <div
       v-if="toolDialogVisible == true"
@@ -11870,6 +11876,7 @@ import EnglishVoice from './EnglishVoice2/index.vue'
 import checkEnglishVoice from './checkEnglishVoice/index.vue'
 import correctText from './components/correctText.vue'
 import scoreItem from './scoreList/scoreItem.vue'
+import scoreZong from './scoreZong/index.vue'
 import classRoomHelper from './classRoomHelper/index.vue'
 
 const getFile = (url) => {
@@ -11945,7 +11952,8 @@ export default {
     checkEnglishVoice,
 		correctText,
 		scoreItem,
-    classRoomHelper
+    classRoomHelper,
+    scoreZong
   },
   data() {
     return {
@@ -19873,13 +19881,17 @@ export default {
       };
     },
 		commentRight(){
-			if(this.$refs["classRoomHelperRef"].type==0){
-				return "100px";
-			}else if(this.$refs["classRoomHelperRef"].type==1){
-				return "502px"
-			}else{
-				return "0px"
+			if(!['1973f6c7-1561-11ee-91d8-005056b86db5','777559d2-7239-11ee-b98c-005056b86db5','884c5665-a453-46f3-b7b6-01d575290aa9'].includes(this.org)){
+				return "35px";
 			}
+			return `calc(${this.classRoomHelperWidth} + 5px)`
+			// if(this.$refs["classRoomHelperRef"].type==0){
+			// 	return "100px";
+			// }else if(this.$refs["classRoomHelperRef"].type==1){
+			// 	return "502px"
+			// }else{
+			// 	return "0px"
+			// }
 		},
     checkUpload() {
       return function () {
@@ -22684,7 +22696,7 @@ export default {
 .pzTop2 .checkbox {
   display: flex;
   align-items: center;
-  padding: 5px 30px;
+  padding: 5px 10px;
   flex: 0 0 auto;
   font-weight: bold;
   border-bottom: 1px solid #eee;

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