Sfoglia il codice sorgente

Merge branch 'beta' of https://git.cocorobo.cn/CocoRoboLabs/pbl-student-table into beta

SanHQin 11 mesi fa
parent
commit
315c78bfae

+ 1 - 1
dist/index.html

@@ -27,7 +27,7 @@
     html,
     html,
     body{
     body{
       font-family: '黑体';
       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.0179b5dd6c0d3a13816d66a91174e412.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.05ebd51d0ab694bbfae2.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {
     document.documentElement.addEventListener("touchstart", function (event) {

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


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


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


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


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


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


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


+ 44 - 9
src/components/classRoomHelper/component/dialogArea.vue

@@ -33,7 +33,7 @@
 
 
                 <div v-else v-for="i in pan(item.aiContent)">
                 <div v-else v-for="i in pan(item.aiContent)">
                   <img
                   <img
-                    style="width: 120px;height: 120px;"
+                    style="width: 130px;height: 130px;"
                     :src="i.image"
                     :src="i.image"
                     alt=""
                     alt=""
                     @click="previewImg(i.image)"
                     @click="previewImg(i.image)"
@@ -46,6 +46,14 @@
                 v-loading="item.loading"
                 v-loading="item.loading"
                 v-html="htmlContent(item.aiContent)"
                 v-html="htmlContent(item.aiContent)"
               ></div>
               ></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 class="d_t_c_a_r_time">{{ item.createtime }}</div>
             </div>
             </div>
           </div>
           </div>
@@ -255,7 +263,7 @@ export default {
       chatLoading: false,
       chatLoading: false,
       roleList2: [],
       roleList2: [],
       chatList: [],
       chatList: [],
-			nowChatList:[],
+      nowChatList: []
     };
     };
   },
   },
   computed: {
   computed: {
@@ -276,6 +284,26 @@ export default {
     }
     }
   },
   },
   methods: {
   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) {
     previewImg(url) {
       this.$hevueImgPreview(url);
       this.$hevueImgPreview(url);
     },
     },
@@ -388,7 +416,7 @@ export default {
             });
             });
           }
           }
         });
         });
-				history.push({ role: "user", content: _text });
+        history.push({ role: "user", content: _text });
         // history.pop();
         // history.pop();
         let params = {
         let params = {
           model: "gpt-3.5-turbo",
           model: "gpt-3.5-turbo",
@@ -437,7 +465,7 @@ export default {
           this.chatList.find(i => i.uid == _uid).isalltext = true;
           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).isShowSynchronization = true;
           this.chatList.find(i => i.uid == _uid).loading = false;
           this.chatList.find(i => i.uid == _uid).loading = false;
-					this.nowChatList.push(this.chatList.find(i=>i.uid==_uid));
+          this.nowChatList.push(this.chatList.find(i => i.uid == _uid));
           // 这里保存对话
           // 这里保存对话
           this.insertChat(_uid);
           this.insertChat(_uid);
           return;
           return;
@@ -486,7 +514,7 @@ export default {
           this.chatList.find(i => i.uid == _uid).isalltext = true;
           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).isShowSynchronization = true;
           this.chatList.find(i => i.uid == _uid).loading = false;
           this.chatList.find(i => i.uid == _uid).loading = false;
-					this.nowChatList.push(this.chatList.find(i=>i.uid==_uid));
+          this.nowChatList.push(this.chatList.find(i => i.uid == _uid));
           this.insertChat(_uid);
           this.insertChat(_uid);
         } else {
         } else {
           let _text = _eData.content.replace("'", "").replace("'", "");
           let _text = _eData.content.replace("'", "").replace("'", "");
@@ -634,7 +662,7 @@ export default {
       // this.rightRole = this.roleType;
       // this.rightRole = this.roleType;
       if (this.choseRoleItem.assistant_id) {
       if (this.choseRoleItem.assistant_id) {
         this.chatList = [];
         this.chatList = [];
-				this.nowChatList = [];
+        this.nowChatList = [];
         let _uuid = uuidv4();
         let _uuid = uuidv4();
         this.chatList.push({
         this.chatList.push({
           role: "user",
           role: "user",
@@ -651,7 +679,7 @@ export default {
           is_mind_map: false,
           is_mind_map: false,
           loading: false
           loading: false
         });
         });
-				
+
         this.scrollBottom();
         this.scrollBottom();
       }
       }
 
 
@@ -818,7 +846,7 @@ export default {
     this.getChatList().then(_ => {
     this.getChatList().then(_ => {
       this.scrollBottom();
       this.scrollBottom();
     });
     });
-		this.nowChatList = [];
+    this.nowChatList = [];
   }
   }
 };
 };
 </script>
 </script>
@@ -834,7 +862,13 @@ export default {
   width: 100%;
   width: 100%;
   height: 100%;
   height: 100%;
 }
 }
-
+.aiCopy {
+  position: absolute;
+  right: 5px;
+  bottom: 0%;
+  /* transform: translate(0, -30%); */
+  cursor: pointer;
+}
 .characterBlock {
 .characterBlock {
   display: flex;
   display: flex;
   background: rgba(54, 169, 252, 1);
   background: rgba(54, 169, 252, 1);
@@ -961,6 +995,7 @@ export default {
   box-sizing: border-box;
   box-sizing: border-box;
   padding-right: 35px;
   padding-right: 35px;
   margin-top: 10px;
   margin-top: 10px;
+  position: relative;
 }
 }
 
 
 .d_t_c_a_right {
 .d_t_c_a_right {

+ 32 - 11
src/components/classRoomHelper/component/searchArea.vue

@@ -49,18 +49,12 @@
           class="s_t_c_ai"
           class="s_t_c_ai"
           v-if="item.content != 'wanSearch' && item.content != 'getImage'"
           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">
           <div class="s_t_c_a_left">
             <span>Ai</span>
             <span>Ai</span>
           </div>
           </div>
           <div class="s_t_c_a_right">
           <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
               <div
                   v-if="!pan(item.aiContent).length"
                   v-if="!pan(item.aiContent).length"
                   class="d_t_c_a_r_content"
                   class="d_t_c_a_r_content"
@@ -68,7 +62,7 @@
                   v-html="item.aiContent"
                   v-html="item.aiContent"
                 ></div>
                 ></div>
               <div v-else  v-for="(i,index) in pan(item.aiContent)" :key=index>
               <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>
             </div>
             <div
             <div
@@ -77,7 +71,14 @@
               v-loading="item.loading"
               v-loading="item.loading"
               v-html="htmlContent(item.aiContent)"
               v-html="htmlContent(item.aiContent)"
             ></div>
             ></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
             <!-- <div
               class="s_t_c_a_r_contentImage"
               class="s_t_c_a_r_contentImage"
               v-loading="item.loading"
               v-loading="item.loading"
@@ -204,6 +205,26 @@ export default {
 		},
 		},
   },
   },
   methods: {
   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) {
     previewImg(url) {
       this.$hevueImgPreview(url);
       this.$hevueImgPreview(url);
     },
     },
@@ -803,7 +824,7 @@ Instruction: Based on the context, follow "Format example", write content.
   position: absolute;
   position: absolute;
   right: 5px;
   right: 5px;
   bottom: 0%;
   bottom: 0%;
-  transform: translate(0, -30%);
+  /* transform: translate(0, -30%); */
   cursor: pointer;
   cursor: pointer;
 }
 }
 
 

+ 46 - 12
src/components/classRoomHelper/component/taskArea.vue

@@ -80,7 +80,7 @@
               ></div>
               ></div>
               <div v-else v-for="i in pan(item.aiContent)">
               <div v-else v-for="i in pan(item.aiContent)">
                 <img
                 <img
-                  style="width: 120px;height: 120px;"
+                  style="width: 130px;height: 130px;"
                   :src="i.image"
                   :src="i.image"
                   alt=""
                   alt=""
                   @click="previewImg(i.image)"
                   @click="previewImg(i.image)"
@@ -93,6 +93,14 @@
               v-loading="item.loading"
               v-loading="item.loading"
               v-html="htmlContent(item.aiContent)"
               v-html="htmlContent(item.aiContent)"
             ></div>
             ></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 class="t_t_c_a_r_time">{{ item.createtime }}</div>
           </div>
           </div>
         </div>
         </div>
@@ -149,7 +157,7 @@ export default {
       loading: false,
       loading: false,
       chatLoading: false,
       chatLoading: false,
       chatList: [],
       chatList: [],
-			nowChatList:[],
+      nowChatList: []
     };
     };
   },
   },
   computed: {
   computed: {
@@ -170,6 +178,26 @@ export default {
     }
     }
   },
   },
   methods: {
   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() {
     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>`;
       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);
       const _chapInfo = JSON.parse(this.courseDetail.chapters);
@@ -229,7 +257,7 @@ export default {
           this.chatList.find(i => i.uid == _uid).isalltext = true;
           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).isShowSynchronization = true;
           this.chatList.find(i => i.uid == _uid).loading = false;
           this.chatList.find(i => i.uid == _uid).loading = false;
-					this.nowChatList.push(this.chatList.find(i=>i.uid==_uid));
+          this.nowChatList.push(this.chatList.find(i => i.uid == _uid));
           // 这里保存对话
           // 这里保存对话
           this.insertChat(_uid);
           this.insertChat(_uid);
           return;
           return;
@@ -363,11 +391,11 @@ export default {
       let history = [];
       let history = [];
       this.nowChatList.forEach(i => {
       this.nowChatList.forEach(i => {
         if (i.content == "wanSearch") {
         if (i.content == "wanSearch") {
-					// history.push({
+          // history.push({
           //   role: "assistant",
           //   role: "assistant",
           //   content: i.aiContent
           //   content: i.aiContent
           // });
           // });
-          return 
+          return;
         } else if (i.content == "getImage") {
         } else if (i.content == "getImage") {
           return history.push({
           return history.push({
             role: "assistant",
             role: "assistant",
@@ -387,7 +415,7 @@ export default {
           });
           });
         }
         }
       });
       });
-			history.push({ role: "user", content: _text });
+      history.push({ role: "user", content: _text });
       // history.pop();
       // history.pop();
       let params = {
       let params = {
         model: "gpt-3.5-turbo",
         model: "gpt-3.5-turbo",
@@ -550,12 +578,11 @@ Instruction: Based on the context, follow "Format example", write content.
       let history = [];
       let history = [];
       this.nowChatList.forEach(i => {
       this.nowChatList.forEach(i => {
         if (i.content == "wanSearch") {
         if (i.content == "wanSearch") {
-					// history.push({
+          // history.push({
           //   role: "assistant",
           //   role: "assistant",
           //   content: JSON.stringify(i.aiContent)
           //   content: JSON.stringify(i.aiContent)
           // });
           // });
-          return 
-					
+          return;
         } else if (i.content == "getImage") {
         } else if (i.content == "getImage") {
           return history.push({
           return history.push({
             role: "assistant",
             role: "assistant",
@@ -579,7 +606,7 @@ Instruction: Based on the context, follow "Format example", write content.
       if (_msg) {
       if (_msg) {
         history.push({ role: "user", content: _msg });
         history.push({ role: "user", content: _msg });
       }
       }
-			// history.push({ role: "user", content: _text });
+      // history.push({ role: "user", content: _text });
       this.scrollBottom();
       this.scrollBottom();
 
 
       let params = {
       let params = {
@@ -627,7 +654,7 @@ Instruction: Based on the context, follow "Format example", write content.
     this.getChatList().then(_ => {
     this.getChatList().then(_ => {
       this.scrollBottom();
       this.scrollBottom();
     });
     });
-		this.nowChatList = [];
+    this.nowChatList = [];
   }
   }
 };
 };
 </script>
 </script>
@@ -638,7 +665,13 @@ Instruction: Based on the context, follow "Format example", write content.
   height: 100%;
   height: 100%;
   box-sizing: border-box;
   box-sizing: border-box;
 }
 }
-
+.aiCopy {
+  position: absolute;
+  right: 5px;
+  bottom: 0%;
+  /* transform: translate(0, -30%); */
+  cursor: pointer;
+}
 .taskTop {
 .taskTop {
   width: 100%;
   width: 100%;
   height: 280px;
   height: 280px;
@@ -817,6 +850,7 @@ Instruction: Based on the context, follow "Format example", write content.
   margin-top: 10px;
   margin-top: 10px;
   box-sizing: border-box;
   box-sizing: border-box;
   padding-right: 35px;
   padding-right: 35px;
+  position: relative;
 }
 }
 
 
 .t_t_c_a_right {
 .t_t_c_a_right {

+ 6 - 0
src/components/courseDetail.vue

@@ -226,6 +226,9 @@
               <span :class="{ active: type == 1 }" @click="getCTwo"
               <span :class="{ active: type == 1 }" @click="getCTwo"
                 >课程分析</span
                 >课程分析</span
               >
               >
+              <!-- <span :class="{ active: type == 3 }" @click="getCThree"
+                >课程评价</span
+              > -->
             </div>
             </div>
             <div
             <div
               v-if="((tType == 1 || tType == 4) && type == 2) || tType == 2"
               v-if="((tType == 1 || tType == 4) && type == 2) || tType == 2"
@@ -1628,6 +1631,9 @@ export default {
       this.type = 1;
       this.type = 1;
       this.getCourseDetail2();
       this.getCourseDetail2();
     },
     },
+    getCThree(){
+      this.type = 3
+    },
     getCourseDetail2() {
     getCourseDetail2() {
       const loading = this.$loading.service({
       const loading = this.$loading.service({
         background: "rgba(255, 255, 255, 0.7)",
         background: "rgba(255, 255, 255, 0.7)",

+ 9 - 2
src/components/easy2/studyStudent.vue

@@ -8079,6 +8079,8 @@
 					<div class="cb-tabList">
 					<div class="cb-tabList">
 						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
 						<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>
 					</div>
           <el-select v-model="pzStype" @change="selectPz" class="selectBox">
           <el-select v-model="pzStype" @change="selectPz" class="selectBox">
             <el-option label="时间降序" :value="1"></el-option>
             <el-option label="时间降序" :value="1"></el-option>
@@ -8185,6 +8187,9 @@
 			<div class="scoreList" v-if="commentTagShow==1">
 			<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"/>
 				<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>
+      <div class="scoreList" v-if="commentTagShow==2" style="position: relative">
+        <scoreZong :courseid="id" :userid="userid"></scoreZong>
+			</div>
     </div>
     </div>
     <div
     <div
       v-if="toolDialogVisible == true"
       v-if="toolDialogVisible == true"
@@ -11897,6 +11902,7 @@ import EnglishVoice from '../EnglishVoice2/index.vue'
 import checkEnglishVoice from '../checkEnglishVoice/index.vue'
 import checkEnglishVoice from '../checkEnglishVoice/index.vue'
 import correctText from '../components/correctText.vue'
 import correctText from '../components/correctText.vue'
 import scoreItem from '../scoreList/scoreItem.vue'
 import scoreItem from '../scoreList/scoreItem.vue'
+import scoreZong from '../scoreZong/index.vue'
 import classRoomHelper from '../classRoomHelper/index.vue'
 import classRoomHelper from '../classRoomHelper/index.vue'
 
 
 const getFile = (url) => {
 const getFile = (url) => {
@@ -11972,7 +11978,8 @@ export default {
     checkEnglishVoice,
     checkEnglishVoice,
 		correctText,
 		correctText,
 		scoreItem,
 		scoreItem,
-		classRoomHelper
+		classRoomHelper,
+    scoreZong
   },
   },
   data() {
   data() {
     return {
     return {
@@ -22718,7 +22725,7 @@ export default {
 .pzTop2 .checkbox {
 .pzTop2 .checkbox {
   display: flex;
   display: flex;
   align-items: center;
   align-items: center;
-  padding: 5px 30px;
+  padding: 5px 10px;
   flex: 0 0 auto;
   flex: 0 0 auto;
   font-weight: bold;
   font-weight: bold;
   border-bottom: 1px solid #eee;
   border-bottom: 1px solid #eee;

+ 9 - 2
src/components/easy3/studyStudent.vue

@@ -8067,6 +8067,8 @@
 					<div class="cb-tabList">
 					<div class="cb-tabList">
 						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
 						<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>
 					</div>
           <el-select v-model="pzStype" @change="selectPz" class="selectBox">
           <el-select v-model="pzStype" @change="selectPz" class="selectBox">
             <el-option label="时间降序" :value="1"></el-option>
             <el-option label="时间降序" :value="1"></el-option>
@@ -8173,6 +8175,9 @@
 			<div class="scoreList" v-if="commentTagShow==1">
 			<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"/>
 				<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>
+      <div class="scoreList" v-if="commentTagShow==2" style="position: relative">
+        <scoreZong :courseid="id" :userid="userid"></scoreZong>
+			</div>
     </div>
     </div>
     <div
     <div
       v-if="toolDialogVisible == true"
       v-if="toolDialogVisible == true"
@@ -11889,6 +11894,7 @@ import EnglishVoice from '../EnglishVoice2/index.vue'
 import checkEnglishVoice from '../checkEnglishVoice/index.vue'
 import checkEnglishVoice from '../checkEnglishVoice/index.vue'
 import correctText from '../components/correctText.vue'
 import correctText from '../components/correctText.vue'
 import scoreItem from '../scoreList/scoreItem.vue'
 import scoreItem from '../scoreList/scoreItem.vue'
+import scoreZong from '../scoreZong/index.vue'
 import classRoomHelper from '../classRoomHelper/index.vue'
 import classRoomHelper from '../classRoomHelper/index.vue'
 
 
 const getFile = (url) => {
 const getFile = (url) => {
@@ -11964,7 +11970,8 @@ export default {
     checkEnglishVoice,
     checkEnglishVoice,
 		correctText,
 		correctText,
 		scoreItem,
 		scoreItem,
-		classRoomHelper
+		classRoomHelper,
+    scoreZong
   },
   },
   data() {
   data() {
     return {
     return {
@@ -22720,7 +22727,7 @@ export default {
 .pzTop2 .checkbox {
 .pzTop2 .checkbox {
   display: flex;
   display: flex;
   align-items: center;
   align-items: center;
-  padding: 5px 30px;
+  padding: 5px 10px;
   flex: 0 0 auto;
   flex: 0 0 auto;
   font-weight: bold;
   font-weight: bold;
   border-bottom: 1px solid #eee;
   border-bottom: 1px solid #eee;

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

@@ -0,0 +1,289 @@
+<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="请输入评分" />
+                </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;
+}
+</style>

+ 9 - 2
src/components/studyStudent.vue

@@ -8077,6 +8077,8 @@
 					<div class="cb-tabList">
 					<div class="cb-tabList">
 						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
 						<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>
 					</div>
           <el-select v-model="pzStype" @change="selectPz" class="selectBox">
           <el-select v-model="pzStype" @change="selectPz" class="selectBox">
             <el-option label="时间降序" :value="1"></el-option>
             <el-option label="时间降序" :value="1"></el-option>
@@ -8183,6 +8185,9 @@
 			<div class="scoreList" v-if="commentTagShow==1">
 			<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"/>
 				<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>
+			<div class="scoreList" v-if="commentTagShow==2" style="position: relative">
+        <scoreZong :courseid="id" :userid="userid"></scoreZong>
+			</div>
     </div>
     </div>
     <div
     <div
       v-if="toolDialogVisible == true"
       v-if="toolDialogVisible == true"
@@ -11871,6 +11876,7 @@ import EnglishVoice from './EnglishVoice2/index.vue'
 import checkEnglishVoice from './checkEnglishVoice/index.vue'
 import checkEnglishVoice from './checkEnglishVoice/index.vue'
 import correctText from './components/correctText.vue'
 import correctText from './components/correctText.vue'
 import scoreItem from './scoreList/scoreItem.vue'
 import scoreItem from './scoreList/scoreItem.vue'
+import scoreZong from './scoreZong/index.vue'
 import classRoomHelper from './classRoomHelper/index.vue'
 import classRoomHelper from './classRoomHelper/index.vue'
 
 
 const getFile = (url) => {
 const getFile = (url) => {
@@ -11946,7 +11952,8 @@ export default {
     checkEnglishVoice,
     checkEnglishVoice,
 		correctText,
 		correctText,
 		scoreItem,
 		scoreItem,
-    classRoomHelper
+    classRoomHelper,
+    scoreZong
   },
   },
   data() {
   data() {
     return {
     return {
@@ -22689,7 +22696,7 @@ export default {
 .pzTop2 .checkbox {
 .pzTop2 .checkbox {
   display: flex;
   display: flex;
   align-items: center;
   align-items: center;
-  padding: 5px 30px;
+  padding: 5px 10px;
   flex: 0 0 auto;
   flex: 0 0 auto;
   font-weight: bold;
   font-weight: bold;
   border-bottom: 1px solid #eee;
   border-bottom: 1px solid #eee;

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