SanHQin 5 månader sedan
förälder
incheckning
90867873fd

+ 24 - 24
src/components/classRoomHelper/component/AnnotationCanvas.vue

@@ -60,7 +60,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="画笔"
+						content="Brush"
 						placement="top"
 					>
 						<svg
@@ -107,7 +107,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="切换颜色与大小"
+						content="Switch color and size"
 						placement="top"
 					>
 						<el-button
@@ -120,9 +120,9 @@
 					</el-tooltip>
 					<div class="brushBtn_colorBox" v-if="openBrushColorBox"  v-click-outside="handleBlur">
 						<div class="bb_cb_drawSize">
-							<div>大小</div>
+							<div>Size</div>
 							<el-slider v-model="drawSize" :min="1" :max="20"></el-slider>
-							<div>颜色</div>
+							<div>Color</div>
 						</div>
 						<div class="bb_cb_drawColor">
 							
@@ -229,7 +229,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="切换形状"
+						content="Switch shape"
 						placement="top"
 					>
 						<el-button
@@ -260,7 +260,7 @@
 									p-id="5384"
 								></path>
 							</svg>
-							<span>直线</span>
+							<span>Line</span>
 						</div>
 						<div
 							class="shapeItem"
@@ -283,7 +283,7 @@
 									p-id="6396"
 								></path>
 							</svg>
-							<span>圆形</span>
+							<span>Circle</span>
 						</div>
 						<div
 							class="shapeItem"
@@ -305,7 +305,7 @@
 									p-id="7360"
 								></path>
 							</svg>
-							<span>箭头</span>
+							<span>Arrow</span>
 						</div>
 						<div
 							class="shapeItem"
@@ -328,7 +328,7 @@
 									p-id="4241"
 								></path>
 							</svg>
-							<span>矩形</span>
+							<span>Rectangle</span>
 						</div>
 					</div>
 					<!-- <div class="brushBtn_colorBox" v-if="openShapeBox">
@@ -350,7 +350,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="橡皮擦"
+						content="Eraser"
 						placement="top"
 					>
 						<svg
@@ -375,7 +375,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="选择大小"
+						content="Select size"
 						placement="top"
 					>
 						<el-button
@@ -393,34 +393,34 @@
 						@click="screenshot()"
 						icon="el-icon-connection"
 						:class="{ active: mode === 'screenshot' }"
-						>截图</el-button
+						>Screenshot</el-button
 					> -->
 
 				<!-- <el-button @click="setMode('line')" :class="{ active: mode === 'line' }"
-          >直线</el-button
+          >Line</el-button
         >
         <el-button @click="setMode('rect')" :class="{ active: mode === 'rect' }"
-          >矩形</el-button
+          >Rectangle</el-button
         >
         <el-button
           @click="setMode('circle')"
           :class="{ active: mode === 'circle' }"
-          >圆圈</el-button
+          >Circle</el-button
         >
 
         <el-button
           @click="setMode('arrow')"
           :class="{ active: mode === 'arrow' }"
-          >箭头</el-button
+          >Arrow</el-button
         > -->
 				<div class="clearScreenBtn">
 					<!-- <el-button @click="clearCanvas" icon="el-icon-refresh-left"
-						>清空画布</el-button
+						>Clear canvas</el-button
 					> -->
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="清空"
+						content="Clear"
 						placement="top"
 					>
 						<svg
@@ -442,7 +442,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="上一步"
+						content="Undo"
 						placement="top"
 					>
 						<svg
@@ -465,10 +465,10 @@
 
 					<!-- <el-button-group style="display: flex">
 						<el-button @click="undo" icon="el-icon-arrow-left"
-							>上一步</el-button
+							>Undo</el-button
 						>
 						<el-button @click="redo"
-							>下一步<i class="el-icon-arrow-right el-icon--right"></i
+							>Redo<i class="el-icon-arrow-right el-icon--right"></i
 						></el-button>
 					</el-button-group> -->
 				</div>
@@ -477,7 +477,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="下一步"
+						content="Redo"
 						placement="top"
 					>
 						<svg
@@ -500,7 +500,7 @@
 				</div>
 				<!-- <div>
 					<el-button @click="downloadCanvas" icon="el-icon-download"
-						>下载</el-button
+						>Download</el-button
 					>
 				</div> -->
 
@@ -508,7 +508,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="结束绘画"
+						content="End drawing"
 						placement="top"
 					>
 						<svg

+ 159 - 159
src/components/classRoomHelper/component/countdown.vue

@@ -35,7 +35,7 @@
                   ></span
                 >
               </div>
-              <span></span>
+              <span>Minutes</span>
             </div>
 
             <div class="c_t_i_card" v-else v-click-outside="handleBlur1">
@@ -48,7 +48,7 @@
                   @keyup.enter.native="changeShowInput1(false)"
                 ></el-input>
               </div>
-              <span></span>
+              <span>Minutes</span>
             </div>
 
             <div
@@ -82,7 +82,7 @@
                   ></span
                 >
               </div>
-              <span></span>
+              <span>Seconds</span>
             </div>
             <div class="c_t_i_card" v-else v-click-outside="handleBlur2">
               <div class="c_t_i_c_inputBox">
@@ -94,7 +94,7 @@
                   @keyup.enter.native="changeShowInput2(false)"
                 ></el-input>
               </div>
-              <span></span>
+              <span>Seconds</span>
             </div>
           </div>
           <div class="c_t_item" v-if="type == 1">
@@ -105,7 +105,7 @@
               <div>
                 <div>{{ keepTimeShow.m2 }}</div>
               </div>
-              <span></span>
+              <span>Minutes</span>
             </div>
 
             <div class="c_t_i_card">
@@ -115,60 +115,60 @@
               <div>
                 <div>{{ keepTimeShow.s2 }}</div>
               </div>
-              <span></span>
+              <span>Seconds</span>
             </div>
           </div>
         </div>
 
         <div class="c_choiceTime" v-if="type == 0">
           <div class="c_title">
-            <span>快捷设置</span>
+            <span>Quick Settings</span>
           </div>
           <div class="c_ct_box">
-            <span @click="setCountdownTime(30)">30</span>
-            <span @click="setCountdownTime(60)">1分钟</span>
-            <span @click="setCountdownTime(120)">2分钟</span>
-            <span @click="setCountdownTime(180)">3分钟</span>
-            <span @click="setCountdownTime(300)">5分钟</span>
-            <span @click="setCountdownTime(360)">6分钟</span>
-            <span @click="setCountdownTime(480)">8分钟</span>
-            <span @click="setCountdownTime(600)">10分钟</span>
+            <span @click="setCountdownTime(30)">30 seconds</span>
+            <span @click="setCountdownTime(60)">1 minute</span>
+            <span @click="setCountdownTime(120)">2 minutes</span>
+            <span @click="setCountdownTime(180)">3 minutes</span>
+            <span @click="setCountdownTime(300)">5 minutes</span>
+            <span @click="setCountdownTime(360)">6 minutes</span>
+            <span @click="setCountdownTime(480)">8 minutes</span>
+            <span @click="setCountdownTime(600)">10 minutes</span>
           </div>
         </div>
 
         <div class="c_behaviorTag">
           <div class="c_title">
-            <span>行为标签</span>
+            <span>Behavior Tags</span>
             <div class="c_t_btnArea">
               <span
                 @click="changeBehaviorTagType(0)"
                 :class="[behaviorTagType == 0 ? 'c_t_ba_active' : '']"
-                >常用</span
+                >Common</span
               >
               <span
                 @click="changeBehaviorTagType(1)"
                 :class="[behaviorTagType == 1 ? 'c_t_ba_active' : '']"
-                >更多</span
+                >More</span
               >
               <!-- <el-button-group>
-								<el-button
-									size="mini"
-									:disabled="isCountdown || isKeepTime"
-									:type="behaviorTagType == 0 ? 'primary' : 'info'"
-									@click.stop="changeBehaviorTagType(0)"
-								>
-									常用
-								</el-button>
-
-								<el-button
-									size="mini"
-									:disabled="isCountdown || isKeepTime"
-									:type="behaviorTagType == 1 ? 'primary' : 'info'"
-									@click.stop="changeBehaviorTagType(1)"
-								>
-									更多
-								</el-button>
-							</el-button-group> -->
+                <el-button
+                  size="mini"
+                  :disabled="isCountdown || isKeepTime"
+                  :type="behaviorTagType == 0 ? 'primary' : 'info'"
+                  @click.stop="changeBehaviorTagType(0)"
+                >
+                  Common
+                </el-button>
+
+                <el-button
+                  size="mini"
+                  :disabled="isCountdown || isKeepTime"
+                  :type="behaviorTagType == 1 ? 'primary' : 'info'"
+                  @click.stop="changeBehaviorTagType(1)"
+                >
+                  More
+                </el-button>
+              </el-button-group> -->
             </div>
           </div>
 
@@ -201,7 +201,7 @@
               <el-tooltip
                 effect="light"
 								placement="top"
-                :content="showSourceList ? '隐藏音乐列表' : '显示音乐列表'"
+                :content="showSourceList ? 'Hide music list' : 'Show music list'"
               >
                 <span @click.stop="()=>showSourceList = !showSourceList">
                   <svg
@@ -233,7 +233,7 @@
             <el-tooltip
               class="item"
               effect="light"
-              :content="sourceActive ? '关闭音乐' : '开启音乐'"
+              :content="sourceActive ? 'Turn off music' : 'Turn on music'"
               placement="top"
             >
               <svg
@@ -353,7 +353,7 @@
             <el-tooltip
               class="item"
               effect="light"
-              content="重置"
+              content="Reset"
               placement="top"
             >
               <svg
@@ -383,7 +383,7 @@
 
         <div class="ActivityMemo">
           <span @click="changeShowType(1)">
-            教学活动备忘
+            Teaching Activity Memo
             <svg
               width="16"
               height="16"
@@ -410,7 +410,7 @@
 
       <div class="c_changeType">
         <div class="c_ct_btn" @click="changeType(0)">
-          <div>倒计时</div>
+          <div>Countdown</div>
           <span v-if="type == 0"></span>
           <svg
             width="21"
@@ -445,7 +445,7 @@
         <span></span>
 
         <div class="c_ct_btn" @click="changeType(1)">
-          <div>计时器</div>
+          <div>Timer</div>
           <span v-if="type == 1"></span>
           <svg
             width="21"
@@ -482,7 +482,7 @@
           @click.stop="changeType(0)"
           :disabled="isCountdown || isKeepTime"
         >
-          倒计时
+          Countdown
         </el-button>
 
         <el-button
@@ -490,7 +490,7 @@
           @click.stop="changeType(1)"
           :disabled="isCountdown || isKeepTime"
         >
-          计时器
+          Timer
         </el-button>
       </el-button-group> -->
       </div>
@@ -518,7 +518,7 @@
               d="M7.66782 3.1263C7.87421 2.94284 8.19025 2.96143 8.37371 3.16782L12.3737 7.66782C12.5421 7.85727 12.5421 8.14274 12.3737 8.33219L8.37371 12.8322C8.19025 13.0386 7.87421 13.0572 7.66782 12.8737C7.46143 12.6903 7.44284 12.3742 7.6263 12.1678L11.331 8.00001L7.6263 3.83219C7.44284 3.6258 7.46143 3.30976 7.66782 3.1263Z"
               fill="black"
             /></svg
-          >返回</span
+          >Back</span
         >
       </div>
       <div class="c_b_btnArea">
@@ -527,13 +527,13 @@
             :type="showBtnType == 0 ? 'primary' : ''"
             size="small"
             @click="showBtnType = 0"
-            >所有事件</el-button
+            >All Events</el-button
           >
           <el-button
             :type="showBtnType == 1 ? 'primary' : ''"
             size="small"
             @click="showBtnType = 1"
-            >计时事件</el-button
+            >Timing Events</el-button
           >
         </el-button-group>
 
@@ -541,7 +541,7 @@
           @click="derive(showMemorandumList)"
           v-loading="exportLoading"
         >
-          <el-tooltip class="item" effect="dark" content="导出" placement="top">
+          <el-tooltip class="item" effect="dark" content="Export" placement="top">
             <svg
               t="1724319590942"
               class="icon"
@@ -565,7 +565,7 @@
             </svg>
           </el-tooltip>
         </span>
-        <!-- <el-button style="margin-left: 20px;" type="warning" @click.stop="derive">导出</el-button> -->
+        <!-- <el-button style="margin-left: 20px;" type="warning" @click.stop="derive">Export</el-button> -->
       </div>
       <div class="c_step" ref="stepRef" v-loading="memorandumLoading">
         <el-timeline>
@@ -576,17 +576,17 @@
             :timestamp="item.time"
             size="large"
           >
-            <span v-html="item.textList.join('')"></span>
+            <span v-html="item.textList.join(',')"></span>
             <div class="c_s_time" v-if="item.timeDiff">
               <div>
                 <span v-if="item.timeDiff.h !== null"
-                  >{{ item.timeDiff.h }}</span
+                  >{{ item.timeDiff.h }} hours</span
                 >
                 <span v-if="item.timeDiff.m !== null"
-                  >{{ item.timeDiff.m }}</span
+                  >{{ item.timeDiff.m }} minutes</span
                 >
                 <span v-if="item.timeDiff.s !== null"
-                  >{{ item.timeDiff.s }}</span
+                  >{{ item.timeDiff.s }} seconds</span
                 >
               </div>
             </div>
@@ -700,18 +700,18 @@ export default {
       behaviorTagMore: [], //更多
       behaviorTagMoreLoading: false,
       behaviorTagCommon: [
-        "小组讨论",
-        "小组汇报",
-        "动手实验",
-        "课堂游戏",
-        "自主学习",
-        "作品展示",
-        "学生演讲",
-        "学生分享",
-        "随堂练习",
-        "快速问答",
-        "阅读资料",
-        "观察记录"
+        "Group Discussion",
+        "Group Presentation",
+        "Hands-on Experiment",
+        "Classroom Game",
+        "Independent Learning",
+        "Project Showcase",
+        "Student Speech",
+        "Student Sharing",
+        "In-class Exercise",
+        "Quick Q&A",
+        "Reading Materials",
+        "Observation Record"
       ], //常用
       choiceBehavior: [],
       memorandumList: [],
@@ -982,110 +982,110 @@ export default {
   },
   methods: {
     derive(_data) {
-      if (this.exportLoading) return this.$message.info("请稍等...");
+      if (this.exportLoading) return this.$message.info("Please wait...");
       this.exportLoading = true;
       let _array = [];
       _data.forEach((item, index) => {
         let json = {};
-        json["时间"] = item.time;
-        json["事件"] = item.textList
+        json["Time"] = item.time;
+        json["Event"] = item.textList
           .map(i => i.replace(/<[^>]+>/g, ""))
           .join(",");
-        json["时间差"] =
+        json["Time Difference"] =
           index == 0
             ? ""
             : `${
                 _data[index - 1].timeDiff.h
-                  ? _data[index - 1].timeDiff.h + ""
+                  ? _data[index - 1].timeDiff.h + " hours"
                   : ""
               }${
                 _data[index - 1].timeDiff.m
-                  ? _data[index - 1].timeDiff.m + ""
+                  ? _data[index - 1].timeDiff.m + " minutes"
                   : ""
               }${
                 _data[index - 1].timeDiff.s
-                  ? _data[index - 1].timeDiff.s + ""
+                  ? _data[index - 1].timeDiff.s + " seconds"
                   : ""
               }`;
         _array.push(json);
       });
 
       let XLSX = require("xlsx");
-      const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
-      let ws = XLSX.utils.json_to_sheet(_array); //将json对象数组转化成工作表
+      const workbook = XLSX.utils.book_new(); // Create a new workbook object
+      let ws = XLSX.utils.json_to_sheet(_array); // Convert the json object array to a worksheet
       ws["!cols"] = [
-        //设置每一列的宽度
+        // Set the width of each column
         { wch: 25 },
         { wch: 50 },
         { wch: 25 }
       ];
-      XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
-      XLSX.writeFile(workbook, "事件.xlsx");
+      XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); // Add the sheet to the workbook, the third parameter is the sheet name
+      XLSX.writeFile(workbook, "Events.xlsx");
 
       this.exportLoading = false;
-      this.$message.success("导出成功");
+      this.$message.success("Export successful");
     },
     lookWork(data) {
       const taskTypes = {
-        查看作业: new Set(),
-        进行点赞: new Set(),
-        进行评论: new Set(),
-        进行评分: new Set()
+        viewHomework: new Set(),
+        like: new Set(),
+        comment: new Set(),
+        mark: new Set()
       };
 
       let _result = [];
 
-      const viewRegex = /查看<span class=['"]variable['"]>(.*?)<\/span>的作业/g;
-      const likeRegex = /对<span class=['"]variable['"]>(.*?)<\/span>的作业进行<span class=['"]btn['"]>点赞<\/span>/g;
-      const commentRegex = /对<span class=['"]variable['"]>(.*?)<\/span>的作业进行<span class=['"]btn['"]>评论<\/span>/g;
-      const markRegex = /对<span class=['"]variable['"]>(.*?)<\/span>的作业进行<span class=['"]btn['"]>评分<\/span>/g;
+      const viewRegex = /view<span class=['"]variable['"]>(.*?)<\/span>'s homework/g;
+      const likeRegex = /give<span class=['"]variable['"]>(.*?)<\/span>'s homework a<span class=['"]btn['"]>like<\/span>/g;
+      const commentRegex = /give<span class=['"]variable['"]>(.*?)<\/span>'s homework a<span class=['"]btn['"]>comment<\/span>/g;
+      const markRegex = /give<span class=['"]variable['"]>(.*?)<\/span>'s homework a<span class=['"]btn['"]>mark<\/span>/g;
       data.forEach(str => {
         if (viewRegex.test(str)) {
           this.extractText(str, viewRegex).forEach(item =>
-            taskTypes["查看作业"].add(item)
+            taskTypes["viewHomework"].add(item)
           );
         } else if (likeRegex.test(str)) {
           this.extractText(str, likeRegex).forEach(item =>
-            taskTypes["进行点赞"].add(item)
+            taskTypes["like"].add(item)
           );
         } else if (commentRegex.test(str)) {
           this.extractText(str, commentRegex).forEach(item =>
-            taskTypes["进行评论"].add(item)
+            taskTypes["comment"].add(item)
           );
         } else if (markRegex.test(str)) {
           this.extractText(str, markRegex).forEach(item =>
-            taskTypes["进行评分"].add(item)
+            taskTypes["mark"].add(item)
           );
         }
       });
 
-      if (Array.from(taskTypes["查看作业"]).length > 0) {
+      if (Array.from(taskTypes["viewHomework"]).length > 0) {
         _result.push(
-          `查看<span class='variable'>${Array.from(taskTypes["查看作业"]).join(
-            ""
-          )}</span>的作业`
+          `view<span class='variable'>${Array.from(taskTypes["viewHomework"]).join(
+            ","
+          )}</span>'s homework`
         );
       }
-      if (Array.from(taskTypes["进行点赞"]).length > 0) {
+      if (Array.from(taskTypes["like"]).length > 0) {
         _result.push(
-          `对<span class='variable'>${Array.from(taskTypes["进行点赞"]).join(
-            ""
-          )}</span>的作业进行<span class="btn">点赞</span>`
+          `give<span class='variable'>${Array.from(taskTypes["like"]).join(
+            ","
+          )}</span>'s homework a<span class="btn">like</span>`
         );
       }
-      if (Array.from(taskTypes["进行评论"]).length > 0) {
+      if (Array.from(taskTypes["comment"]).length > 0) {
         _result.push(
-          `对<span class='variable'>${Array.from(taskTypes["进行评论"]).join(
-            ""
-          )}</span>的作业进行<span class="btn">评论</span>`
+          `give<span class='variable'>${Array.from(taskTypes["comment"]).join(
+            ","
+          )}</span>'s homework a<span class="btn">comment</span>`
         );
       }
 
-      if (Array.from(taskTypes["进行评分"]).length > 0) {
+      if (Array.from(taskTypes["mark"]).length > 0) {
         _result.push(
-          `对<span class='variable'>${Array.from(taskTypes["进行评分"]).join(
-            ""
-          )}</span>的作业进行<span class="btn">评分</span>`
+          `give<span class='variable'>${Array.from(taskTypes["mark"]).join(
+            ","
+          )}</span>'s homework a<span class="btn">mark</span>`
         );
       }
 
@@ -1126,8 +1126,8 @@ export default {
       // 构建结果数组
       map.forEach((btns, variable) => {
         // 构建新的字符串
-        let newString = `对<span class="variable">${variable}</span>的作业<span class="btn">${btns.join(
-          ""
+        let newString = `For<span class="variable">${variable}</span>'s homework<span class="btn">${btns.join(
+          ","
         )}</span>`;
         result.push(newString);
       });
@@ -1165,7 +1165,7 @@ export default {
         // 将操作部分合并成一个字符串
         let combinedOperations = map[variable].join("、");
         result.push(
-          `查看<span class="variable">${variable}</span>的<span class="btn">${combinedOperations}</span>`
+          `View<span class="variable">${variable}</span>'s<span class="btn">${combinedOperations}</span>`
         );
       }
 
@@ -1235,8 +1235,8 @@ export default {
       this.type = newType;
     },
     changeBehaviorTagType(newType) {
-      if (this.isCountdown) return this.$message.error("正在倒计时");
-      if (this.isKeepTime) return this.$message.error("正在计时");
+      if (this.isCountdown) return this.$message.error("Countdown is in progress");
+      if (this.isKeepTime) return this.$message.error("Timing is in progress");
       if (this.behaviorTagType == newType) return;
       this.choiceBehavior = [];
       this.behaviorTagType = newType;
@@ -1245,14 +1245,14 @@ export default {
       }
     },
     setCountdownTime(newTime = 0) {
-      if (this.isCountdown) return this.$message.error("正在倒计时");
-      if (this.isKeepTime) return this.$message.error("正在计时");
+      if (this.isCountdown) return this.$message.error("Countdown is in progress");
+      if (this.isKeepTime) return this.$message.error("Timing is in progress");
       this.countdownTime = newTime;
     },
     addTime(time = 0) {
-      if (this.isCountdown) return console.log("正在计时");
+      if (this.isCountdown) return console.log("Counting down");
       if (this.countdownTime >= 3600) {
-        return this.$message.error("倒计时最高一小时");
+        return this.$message.error("Countdown maximum is one hour");
       }
       if (this.countdownTime + time > 3600) {
         return (this.countdownTime = 3600);
@@ -1260,16 +1260,16 @@ export default {
       this.countdownTime += time;
     },
     reduceTime(time = 0) {
-      if (this.isCountdown) return console.log("正在计时");
+      if (this.isCountdown) return console.log("Counting down");
       if (this.countdownTime - time < 0) return (this.countdownTime = 0);
       this.countdownTime -= time;
     },
     choiceBehaviorTag(tag) {
-      if (this.isCountdown) return this.$message.error("正在倒计时");
-      if (this.isKeepTime) return this.$message.error("正在计时");
+      if (this.isCountdown) return this.$message.error("Countdown is in progress");
+      if (this.isKeepTime) return this.$message.error("Timing is in progress");
       let _index = this.choiceBehavior.findIndex(i => i == tag);
       if (_index != -1) {
-        // 数组删除指定下标数据
+        // Remove specified index data from the array
         this.choiceBehavior.splice(_index, 1);
       } else {
         this.choiceBehavior.push(tag);
@@ -1277,20 +1277,20 @@ export default {
     },
     countdownTimeFn() {
       if (this.isCountdown) {
-        //取消
+        // Cancel
         clearInterval(this.countdownTimeTimer);
         this.countdownTimeTimer = null;
         this.isCountdown = false;
         if (this.$refs.audioRef.playing && this.sourceActive) {
           this.$refs.audioRef.pause();
         }
-        this.$message.success("已暂停倒计时");
+        this.$message.success("Countdown has been paused");
       } else {
-        //开始
+        // Start
         if (this.countdownTime == 0)
-          return this.$message.error("请设置倒计时时间");
+          return this.$message.error("Please set the countdown time");
         this.isCountdown = true;
-        this.$message.success("已开始倒计时");
+        this.$message.success("Countdown has started");
         if (this.sourceActive) {
           this.$refs.audioRef.setVolume(0);
           this.$refs.audioRef.play();
@@ -1323,13 +1323,13 @@ export default {
           this.isCountdown = true;
           this.countdownTime -= 1;
         }, 1000);
-        let timeShow = `${this.countdownTimeShow.m1}${this.countdownTimeShow.m2}分钟${this.countdownTimeShow.s1}${this.countdownTimeShow.s2}秒`;
+        let timeShow = `${this.countdownTimeShow.m1}${this.countdownTimeShow.m2} minutes ${this.countdownTimeShow.s1}${this.countdownTimeShow.s2} seconds`;
         this.insertMemorandum(
-          `设置<span class="variable">${timeShow}</span><span class="btn">倒计时</span>${
+          `Set<span class="variable">${timeShow}</span><span class="btn">countdown</span>${
             this.choiceBehavior.length > 0
-              ? ",用于" +
+              ? ", for " +
                 '<span class="btn">' +
-                this.choiceBehavior.join("") +
+                this.choiceBehavior.join(", ") +
                 "</span>"
               : ""
           }`
@@ -1351,7 +1351,7 @@ export default {
         time: this.countdownTimeDefault,
         tag: this.choiceBehavior
       };
-      this.insertMemorandum(`<span class="btn">倒计时</span>结束`);
+      this.insertMemorandum(`<span class="btn">Countdown</span> finished`);
       this.choiceBehavior = [];
       this.insertData(_data);
     },
@@ -1363,7 +1363,7 @@ export default {
         if (this.$refs.audioRef.playing && this.sourceActive) {
           this.$refs.audioRef.pause();
         }
-        this.$message.success("已停止计时");
+        this.$message.success("Timing has been stopped");
       } else {
         this.isKeepTime = true;
         if (this.sourceActive) {
@@ -1373,11 +1373,11 @@ export default {
         this.keepTimeTimer = setInterval(() => {
           this.keepTime += 1;
         }, 1000);
-        this.$message.success("已开始计时");
+        this.$message.success("Timing has started");
         this.insertMemorandum(
-          `使用<span class="btn">计时器</span>${
+          `Using<span class="btn">timer</span>${
             this.choiceBehavior.length > 0
-              ? ",用于" +
+              ? ", for " +
                 '<span class="btn">' +
                 this.choiceBehavior.join("、") +
                 "</span>"
@@ -1413,9 +1413,9 @@ export default {
     reset() {
       if (this.type == 0) {
         if (this.isCountdown) {
-          this.$confirm("正在倒计时!确定重置倒计时吗?", "提醒", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
+          this.$confirm("Countdown is in progress! Are you sure you want to reset the countdown?", "Reminder", {
+            confirmButtonText: "Confirm",
+            cancelButtonText: "Cancel",
             type: "warning"
           })
             .then(_ => {
@@ -1425,18 +1425,18 @@ export default {
               this.countdownTime = 0;
               this.isCountdown = false;
               this.choiceBehavior = [];
-              this.$message.success("已重置");
+              this.$message.success("Reset successful");
               if (this.$refs.audioRef.playing) {
                 this.$refs.audioRef.pause();
               }
             })
             .catch(_ => {
-              console.log("取消重置");
+              console.log("Reset canceled");
             });
         } else {
-          this.$confirm("确定重置倒计时吗?", "提醒", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
+          this.$confirm("Are you sure you want to reset the countdown?", "Reminder", {
+            confirmButtonText: "Confirm",
+            cancelButtonText: "Cancel",
             type: "warning"
           })
             .then(_ => {
@@ -1447,17 +1447,17 @@ export default {
               this.countdownTime = 0;
               this.isCountdown = false;
               this.choiceBehavior = [];
-              this.$message.success("已重置");
+              this.$message.success("Reset successful");
             })
             .catch(_ => {
-              console.log("取消重置");
+              console.log("Reset canceled");
             });
         }
       } else if (this.type == 1) {
         if (this.isKeepTime) {
-          this.$confirm("正在计时!确定重置计时吗?", "提醒", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
+          this.$confirm("Timing is in progress! Are you sure you want to reset the timing?", "Reminder", {
+            confirmButtonText: "Confirm",
+            cancelButtonText: "Cancel",
             type: "warning"
           })
             .then(_ => {
@@ -1471,13 +1471,13 @@ export default {
                 time: this.keepTime,
                 tag: this.choiceBehavior
               };
-              let timeShow = `${this.keepTimeShow.m1}${this.keepTimeShow.m2}分钟${this.keepTimeShow.s1}${this.keepTimeShow.s2}秒`;
+              let timeShow = `${this.keepTimeShow.m1}${this.keepTimeShow.m2} minutes ${this.keepTimeShow.s1}${this.keepTimeShow.s2} seconds`;
               this.insertMemorandum(
-                `结束计时器,<span class="btn">计时</span><span class="variable">${timeShow}</span>${
+                `End timer, <span class="btn">Timing</span><span class="variable">${timeShow}</span>${
                   this.choiceBehavior.length > 0
-                    ? ",用于" +
+                    ? " for " +
                       '<span class="btn">' +
-                      this.choiceBehavior.join("") +
+                      this.choiceBehavior.join(", ") +
                       "</span>"
                     : ""
                 }`
@@ -1487,7 +1487,7 @@ export default {
               this.insertData(_data);
             })
             .catch(_ => {
-              console.log("取消重置");
+              console.log("Reset canceled");
             });
         } else {
           let _data = {
@@ -1499,13 +1499,13 @@ export default {
             this.$refs.audioRef.pause();
           }
           this.insertData(_data);
-          let timeShow = `${this.keepTimeShow.m1}${this.keepTimeShow.m2}分钟${this.keepTimeShow.s1}${this.keepTimeShow.s2}秒`;
+          let timeShow = `${this.keepTimeShow.m1}${this.keepTimeShow.m2} minutes ${this.keepTimeShow.s1}${this.keepTimeShow.s2} seconds`;
           this.insertMemorandum(
-            `结束计时器,<span class="btn">计时</span><span class="variable">${timeShow}</span>${
+            `End timer, <span class="btn">Timing</span><span class="variable">${timeShow}</span>${
               this.choiceBehavior.length > 0
-                ? ",用于" +
+                ? " for " +
                   '<span class="btn">' +
-                  this.choiceBehavior.join("") +
+                  this.choiceBehavior.join(", ") +
                   "</span>"
                 : ""
             }`
@@ -1513,7 +1513,7 @@ export default {
           this.keepTime = 0;
           this.isKeepTime = false;
           // this.choiceBehavior = [];
-          this.$message.success("已重置");
+          this.$message.success("Reset successful");
         }
       }
     },
@@ -1572,7 +1572,7 @@ ${_textData}
         })
         .catch(e => {
           this.behaviorTagMoreLoading = false;
-          this.$message.error("获取更多行为标签失败");
+          this.$message.error("Failed to retrieve more behavior tags");
           this.behaviorTagType = 0;
           this.behaviorTagMore = [];
           console.log(e);
@@ -1634,7 +1634,7 @@ ${_textData}
         .catch(err => {
           console.log(err);
           this.memorandumLoading = false;
-          this.$message.error("获取行为备忘失败");
+          this.$message.error("Failed to retrieve behavior memorandum");
         });
     },
 
@@ -1705,7 +1705,7 @@ ${_textData}
       };
     },
 		changeSourceUrl(url){
-			if(this.isCountdown || this.isKeepTime)return this.$message.error("请先停止计时再设置");
+			if(this.isCountdown || this.isKeepTime)return this.$message.error("Please stop the timer before setting.");
 			if(this.sourceUrl == url)return this.showSourceList = false;
 			this.sourceUrl = url;
 

+ 27 - 27
src/components/classRoomHelper/component/dialogArea.vue

@@ -12,14 +12,14 @@
               <div class="d_t_c_u_l_time">{{ item.createtime }}</div>
             </div>
             <div class="d_t_c_u_right">
-              <span></span>
+              <span>Me</span>
             </div>
           </div>
 
           <div class="d_t_c_ai" v-if="item.content != 'addAsk'">
             <div class="d_t_c_a_left">
               <el-avatar v-if="item.filename" :src="item.filename"></el-avatar>
-              <span v-else>Ai</span>
+              <span v-else>AI</span>
             </div>
             <div class="d_t_c_a_right">
               <div
@@ -123,7 +123,7 @@
             <el-tooltip
               class="item"
               effect="dark"
-              content="清空聊天记录"
+              content="Clear chat history"
               placement="top"
             >
               <img
@@ -135,7 +135,7 @@
             <el-tooltip
               class="item"
               effect="dark"
-              :content="openMegaphone ? '关闭喇叭' : '打开喇叭'"
+              :content="openMegaphone ? 'Turn off the megaphone' : 'Turn on the megaphone'"
               placement="top"
             >
               <img
@@ -162,7 +162,7 @@
               src="../../../assets/icon/course/role.png"
               alt=""
             />
-            选择智能体
+            Choose Intelligent Agent
           </div>
         </div>
         <div class="d_b_inputArea">
@@ -174,8 +174,8 @@
               @keyup.enter.native="send()"
               :placeholder="
                 sendFnType == 0
-                  ? '请在此输入您想了解的内容'
-                  : '请点击录音按钮开始录音'
+                  ? 'Please enter the content you want to know here'
+                  : 'Please click the recording button to start recording'
               "
               class="d_b_i_left"
               v-model="text"
@@ -189,7 +189,7 @@
               v-if="sendFnType == 0"
               class="item"
               effect="dark"
-              content="使用语音"
+              content="Use voice"
               placement="top"
             >
               <img
@@ -202,7 +202,7 @@
               v-if="sendFnType == 1"
               class="item"
               effect="dark"
-              content="使用键盘"
+              content="Use keyboard"
               placement="top"
             >
               <img
@@ -213,7 +213,7 @@
           </div>
           <div class="d_b_btn" @click="send()" v-if="sendFnType == 0">
             <span v-if="!loading && !chatLoading"></span>
-            <div v-else @click.stop="stopSend()">停止</div>
+            <div v-else @click.stop="stopSend()">Stop</div>
           </div>
 
           <div class="d_b_btn" v-if="sendFnType == 1">
@@ -228,7 +228,7 @@
               @click.stop="stopTalk()"
               :src="require('../../../assets/icon/course/isTape.svg')"
             />
-            <div v-else @click.stop="stopSend()">停止</div>
+            <div v-else @click.stop="stopSend()">Stop</div>
           </div>
         </div>
       </div>
@@ -236,8 +236,8 @@
     <div class="" v-show="cardType == 1">
       <div class="choiceTop">
         <div class="choiceRoleHeader">
-          <div>切换角色:</div>
-          <span>您希望以下哪个角色回答您的问题,请选择:</span>
+          <div>Switch Role:</div>
+          <span>Please choose which role you would like to answer your question:</span>
         </div>
         <div class="choiceSelect">
           <el-button
@@ -248,7 +248,7 @@
             }"
             @click="optBtn(0)"
             plain
-            >我的</el-button
+            >My</el-button
           >
           <el-button
             class="option"
@@ -258,7 +258,7 @@
             }"
             @click="optBtn(1)"
             plain
-            >社区</el-button
+            >Community</el-button
           >
         </div>
         <div
@@ -284,7 +284,7 @@
                     : 'none'
               }"
             >
-              已选择
+              Selected
             </div>
             <!-- <span></span> -->
           </div>
@@ -319,7 +319,7 @@
                     : 'none'
               }"
             >
-              已选择
+              Selected
             </div>
             <!-- <span></span> -->
           </div>
@@ -354,28 +354,28 @@
       </div>
       <div class="choiceBottom">
         <el-button class="cb_btn" size="mini" @click="noChangeRole()"
-          >取消</el-button
+          >Cancel</el-button
         >
         <el-button
           class="cb_btn"
           size="mini"
           type="primary"
           @click="changeRole()"
-          >确定</el-button
+          >Confirm</el-button
         >
       </div>
     </div>
     <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-      src="https://cloud.cocorobo.hk/browser/public/index.html"
+      src="https://beta.cloud.cocorobo.cn/browser/public/index.html"
       ref="iiframe"
       v-show="false"
     ></iframe>
 
-		 <!-- 文字转语音-->
-		 <iframe
+    <!-- Text to Speech -->
+    <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-      src="https://cloud.cocorobo.hk/browser/public/index1.html"
+      src="https://beta.cloud.cocorobo.cn/browser/public/index1.html"
       ref="iiframe2"
       v-show="false"
     ></iframe>
@@ -388,9 +388,9 @@ import MarkdownIt from "markdown-it";
 
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
-		from:'cn',
-		to:'hk'
-})
+  from: "hk",
+  to: "cn"
+});
 export default {
   props: {
     fileId: {
@@ -466,7 +466,7 @@ export default {
       this.send(item.content);
     },
     changeFnType(newValue) {
-      if (this.isTalk) return this.$message.info("请先停止录音");
+      if (this.isTalk) return this.$message.info("Please stop recording first");
       this.sendFnType = newValue;
     },
     talk() {

+ 20 - 20
src/components/classRoomHelper/component/languageAssistant.vue

@@ -28,15 +28,15 @@
       <div class="la_m_talk" v-if="show && openMessage">
         <div v-if="showTextIndex == 0" v-html="htmlContent(aiText)"></div>
         <div v-if="showTextIndex == 1">{{ userText }}</div>
-        <div v-if="showTextIndex == 2">正在组织语言...</div>
+        <div v-if="showTextIndex == 2">Organizing language...</div>
       </div>
       <div class="la_m_talk" v-if="!openMessage">
-        <div>你好,我是可可同学,是个小小百事通,你有什么想和我聊一聊?</div>
+        <div>Hello, I am Coco, a little know-it-all. What would you like to chat with me about?</div>
       </div>
     </div>
     <div class="la_btn">
       <div class="la_b_noTel" v-if="!show">
-        <el-tooltip class="item" effect="light" content="通话" placement="top">
+        <el-tooltip class="item" effect="light" content="Call" placement="top">
           <span>
             <svg
               @click.stop="recordStart"
@@ -60,7 +60,7 @@
         <el-tooltip
           class="item"
           effect="light"
-          content="暂停"
+          content="Pause"
           placement="top"
           v-if="canTalk"
         >
@@ -87,7 +87,7 @@
         <el-tooltip
           class="item"
           effect="light"
-          content="开启"
+          content="Start"
           placement="top"
           v-else
         >
@@ -110,7 +110,7 @@
           </span>
         </el-tooltip>
 
-        <el-tooltip class="item" effect="light" content="挂断" placement="top">
+        <el-tooltip class="item" effect="light" content="Hang up" placement="top">
           <svg
             @click.stop="stopRecord"
             t="1721367811838"
@@ -127,7 +127,7 @@
             ></path>
           </svg>
         </el-tooltip>
-        <el-tooltip class="item" effect="light" content="中断" placement="top">
+        <el-tooltip class="item" effect="light" content="Interrupt" placement="top">
           <span @click.stop="interrupt">
             <img :src="require('../../../assets/icon/course/stop2.png')" />
             <!-- <svg
@@ -149,21 +149,21 @@
         </el-tooltip>
       </div>
       <div class="openMessage" v-if="show">
-        <el-checkbox v-model="openMessage">开启字幕</el-checkbox>
+        <el-checkbox v-model="openMessage">Enable subtitles</el-checkbox>
       </div>
     </div>
-    <!-- 录音转文字 -->
+    <!-- Recording to text -->
     <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-      src="https://cloud.cocorobo.hk/browser/public/index.html"
+      src="https://beta.cloud.cocorobo.cn/browser/public/index.html"
       ref="iiframe"
       v-show="false"
     ></iframe>
 
-    <!-- 文字转语音-->
+    <!-- Text to speech -->
     <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-      src="https://cloud.cocorobo.hk/browser/public/index1.html"
+      src="https://beta.cloud.cocorobo.cn/browser/public/index1.html"
       ref="iiframe2"
       v-show="false"
     ></iframe>
@@ -180,7 +180,7 @@ export default {
       show: true,
       showIndex: 2, //0 :在说话 1 : 接收 2:待命
       aiStatus: 0,
-      aiText: "我是可可同学,我是个小小百事通,你有什么想和我聊一聊?",
+      aiText: "Hello, I am Coco, a little know-it-all. What would you like to chat with me about?",
       userText: "",
       showTextIndex: 0, //0:ai,1:用户, 2:组织语言  3: 无
       timer: null,
@@ -236,7 +236,7 @@ export default {
 				this.talkLoading = false;
         this.isOpen = true;
         this.show = true;
-        this.aiText = "我是可可同学,我是个小小百事通,你有什么想和我聊一聊?";
+        this.aiText = "I am Keke, a little know-it-all. What would you like to chat with me about?";
         iiframe.contentWindow.onRecognizedResult = e => {
           let _msg = converter(e.privText);
 
@@ -321,7 +321,7 @@ export default {
                     session_name: _uuid + "-qgt",
                     uid: _uuid,
                     file_ids: [],
-                    model: "gpt-4o-mini"
+                    model: "gpt-4o-2024-08-06"
                   };
                   this.ajax
                     // .post("https://claude3.cocorobo.cn/chat", params)
@@ -344,7 +344,7 @@ export default {
                         this.aiStatus = 0;
                         this.showTextIndex = 0;
                         this.showIndex = 0;
-                        this.aiText = "对不起,我无法理解您的问题,请重新提问";
+                        this.aiText = "I'm sorry, I cannot understand your question. Please ask again.";
                         // this.timer = setTimeout(() => {
                         //   this.showTextIndex = 3;
                         //   this.aiStatus = 2;
@@ -359,7 +359,7 @@ export default {
                       this.aiStatus = 0;
                       this.showTextIndex = 0;
                       this.showIndex = 0;
-                      this.aiText = "对不起,我无法理解您的问题,请重新提问";
+                      this.aiText = "I'm sorry, I cannot understand your question, please ask again.";
                       // this.timer = setTimeout(() => {
                       //   this.showTextIndex = 3;
                       //   this.aiStatus = 2;
@@ -401,7 +401,7 @@ export default {
         this.show = false;
         this.showTextIndex = 3;
         this.showIndex = 2;
-        this.$message.success("已关闭语音助手");
+        this.$message.success("Voice assistant has been closed.");
         if (this.talkLoading) {
           this.$refs.iiframe2.contentWindow.closesynthesizer();
         }
@@ -604,7 +604,7 @@ export default {
 			this.canTalk = true;
 			this.showIndex = 0;
 			this.showTextIndex = 0;
-			this.aiText = "我是可可同学,我是个小小百事通,你有什么想和我聊一聊";
+			this.aiText = "I am Koko, a little know-it-all. What would you like to chat with me about?";
 			this.chatLoading = false;
 		}
   },
@@ -634,7 +634,7 @@ export default {
 			console.log('报错👇')
 			console.log(error)
 			this.loading = false;
-			this.$message.error("开启语音助手失败")
+			this.$message.error("Failed to start the voice assistant")
 		}
   }
 };

+ 7 - 7
src/components/classRoomHelper/component/levitatedSphere.vue

@@ -40,7 +40,7 @@
     <!-- 录音转文字 -->
     <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-      src="https://cloud.cocorobo.hk/browser/public/index.html"
+      src="https://beta.cloud.cocorobo.cn/browser/public/index.html"
       ref="iiframe"
       v-show="false"
     ></iframe>
@@ -48,7 +48,7 @@
     <!-- 文字转语音-->
     <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-      src="https://cloud.cocorobo.hk/browser/public/index1.html"
+      src="https://beta.cloud.cocorobo.cn/browser/public/index1.html"
       ref="iiframe2"
       v-show="false"
     ></iframe>
@@ -119,8 +119,8 @@ export default {
     recordStart(_text) {
       var OpenCC = require("opencc-js");
       let converter = OpenCC.Converter({
-        from: "cn",
-        to: "hk"
+        from: "hk",
+        to: "cn"
       });
       // try {
       // this.$parent.changeRecordType(1);
@@ -244,7 +244,7 @@ export default {
                   session_name: _uuid + "-qgt",
                   uid: _uuid,
                   file_ids: [],
-									model: "gpt-4o-mini",
+									model: "gpt-4o-2024-08-06",
                 };
                 this.ajax
                   // .post("https://claude3.cocorobo.cn/chat", params)
@@ -335,8 +335,8 @@ export default {
     chineseToNumber(chinese) {
       var OpenCC = require("opencc-js");
       let converter = OpenCC.Converter({
-        from: "cn",
-        to: "hk"
+        from: "hk",
+        to: "cn"
       });
       chinese = converter(chinese);
       const chineseNumbers = {

+ 164 - 158
src/components/classRoomHelper/component/searchArea.vue

@@ -16,7 +16,7 @@
             <div class="s_t_c_u_l_time">{{ item.createtime }}</div>
           </div>
           <div class="s_t_c_u_right">
-            <span></span>
+            <span>Me</span>
           </div>
         </div>
 
@@ -183,7 +183,7 @@
               <div class="s_t_c_a_r_content2" v-loading="item.loading">
                 <div class="s_t_c_a_r_c_title">
                   <img :src="require('../../../assets/icon/course/idea.png')" />
-                  <span>猜你想搜:</span>
+                  <span>You might want to search for:</span>
                 </div>
                 <div
                   class="s_t_c_a_r_c_item"
@@ -247,7 +247,7 @@
               ></el-avatar>
             </div>
             <div class="s_t_c_a_right">
-              <div class="s_t_c_a_r_content">选择您需要的智能体,开始对话</div>
+              <div class="s_t_c_a_r_content">Select the intelligent agent you need to start the conversation</div>
             </div>
           </div>
         </div>
@@ -257,12 +257,12 @@
             <span
               :class="sortOption == 0 ? 'cs_typeActive' : ''"
               @click="optBtn(0)"
-              >我的</span
+              >My</span
             >
             <span
               :class="sortOption == 1 ? 'cs_typeActive' : ''"
               @click="optBtn(1)"
-              >社区</span
+              >Community</span
             >
           </div>
           <div class="cs_box">
@@ -420,7 +420,7 @@
             ><el-tooltip
               class="item"
               effect="dark"
-              content="清空聊天记录"
+              content="Clear chat history"
               placement="top"
             >
               <svg
@@ -466,7 +466,7 @@
             ><el-tooltip
               class="item"
               effect="dark"
-              :content="openMegaphone ? '默认不朗诵' : '默认朗诵'"
+              :content="openMegaphone ? 'Default not to read aloud' : 'Default to read aloud'"
               placement="top"
             >
               <svg
@@ -732,7 +732,7 @@
                     fill-opacity="0.9"
                   />
                 </svg>
-                <span>课堂小贴士</span>
+                <span>Classroom Tips</span>
                 <svg
                   width="16"
                   height="16"
@@ -784,7 +784,7 @@
             />
           </svg>
 
-          智能体
+          Intelligent Body
         </div>
         <div
           :class="['s_b_ba-item', sendType == 3 ? 's_b_ba_active' : '']"
@@ -792,7 +792,7 @@
         >
           <!-- <img src="../../../assets/icon/course/sImg.png" style="margin-right: 5px;" alt="" v-if="sendType!=3">
 					<img src="../../../assets/icon/course/sImg2.png" style="margin-right: 5px;" alt="" v-else> -->
-          生成图片
+          Generate Image
         </div>
         <div
           :class="['s_b_ba-item', sendType == 1 ? 's_b_ba_active' : '']"
@@ -800,7 +800,7 @@
         >
           <!-- <img src="../../../assets/icon/course/sImg.png" style="margin-right: 5px;" alt="" v-if="sendType!=1">
 					<img src="../../../assets/icon/course/sImg2.png" style="margin-right: 5px;" alt="" v-else> -->
-          搜索图片
+          Search Image
         </div>
         <div
           :class="['s_b_ba-item', sendType == 2 ? 's_b_ba_active' : '']"
@@ -808,7 +808,7 @@
         >
           <!-- <img src="../../../assets/icon/course/sRio.png" style="margin-right: 5px;" alt="" v-if="sendType!=2">
 					<img src="../../../assets/icon/course/sRio2.png" style="margin-right: 5px;" alt="" v-else> -->
-          搜索视频
+          Search Video
         </div>
       </div>
 
@@ -817,12 +817,12 @@
           <span
             :class="[atTagIndex == 0 ? 's_b_at_tag_active' : '']"
             @click.stop="atTagIndex = 0"
-            >任务</span
+            >Task</span
           >
           <span
             :class="[[1, 2].includes(atTagIndex) ? 's_b_at_tag_active' : '']"
             @click.stop="atTagIndex = 1"
-            >成员</span
+            >Members</span
           >
         </div>
         <div class="s_b_at_list">
@@ -832,10 +832,10 @@
                 class="s_b_at_l_top"
                 v-if="item1.dyName"
                 @click="
-                  atTask(`阶段${index1 + 1} ${item1.dyName} `, index1, 0, item1)
+                  atTask(`Stage ${index1 + 1} ${item1.dyName} `, index1, 0, item1)
                 "
               >
-                <span>阶段{{ index1 + 1 }} {{ item1.dyName }}</span>
+                <span>Stage {{ index1 + 1 }} {{ item1.dyName }}</span>
                 <span
                   class="s_b_at_l_i_h_icon1"
                   :style="
@@ -855,7 +855,7 @@
                   v-if="item2.tool[0].tool != undefined"
                   @click="
                     atTask(
-                      `阶段${index1 + 1} ${item1.dyName}-任务${index2 + 1}:${
+                      `Stage ${index1 + 1} ${item1.dyName}-Task ${index2 + 1}:${
                         item2.taskName
                       } `,
                       index2,
@@ -871,14 +871,14 @@
                     "
                     @click.stop="item2.isOpen = !item2.isOpen"
                   ></span>
-                  <span>任务{{ index2 + 1 }}:{{ item2.taskName }}</span>
+                  <span>Task {{ index2 + 1 }}:{{ item2.taskName }}</span>
                 </div>
                 <div
                   class="s_b_at_l_i_header"
                   v-else
                   @click="
                     atTask(
-                      `阶段${index1 + 1} ${item1.dyName}-任务${index2 + 1}:${
+                      `Stage ${index1 + 1} ${item1.dyName}-Task ${index2 + 1}:${
                         item2.taskName
                       } `,
                       index2,
@@ -894,7 +894,7 @@
                     "
                     @click.stop="item2.isOpen = !item2.isOpen"
                   ></span>
-                  <span>任务{{ index2 + 1 }}:{{ item2.taskName }}</span>
+                  <span>Task {{ index2 + 1 }}:{{ item2.taskName }}</span>
                 </div>
                 <div
                   class="s_b_at_l_i_content"
@@ -903,22 +903,22 @@
                   :key="index1 + '-' + index2 + '-' + index3"
                   @click="
                     atTask(
-                      `阶段${index1 + 1} ${item1.dyName}-任务${index2 + 1}:${
+                      `Stage ${index1 + 1} ${item1.dyName}-Task ${index2 + 1}:${
                         item2.taskName
-                      }-工具${index3 + 1}:${toolsList[item3.tool]} `,
+                      }-Tool ${index3 + 1}:${toolsList[item3.tool]} `,
                       index3,
                       2,
                       item3
                     )
                   "
                 >
-                  <span>工具{{ index3 + 1 }}:{{ toolsList[item3.tool] }}</span>
+                  <span>Tool {{ index3 + 1 }}:{{ toolsList[item3.tool] }}</span>
                 </div>
               </div>
             </div>
           </template>
           <template v-if="atTagIndex == 1 && workSum != 0">
-            <div v-if="userList.length == 0">暂无成员...</div>
+            <div v-if="userList.length == 0">No members available...</div>
             <div
               class="s_b_ab_user"
               v-for="(item, index) in userList"
@@ -936,15 +936,15 @@
                 </el-tooltip>
               </div>
               <div class="s_b_ab_u_message">
-                <span>作业提交情况</span>
+                <span>Homework Submission Status</span>
                 <div>
-                  <span>已提交:{{ item.count }}</span>
-                  <span>未提交:{{ workSum - item.count }}</span>
+                  <span>Submitted: {{ item.count }}</span>
+                  <span>Not Submitted: {{ workSum - item.count }}</span>
                 </div>
               </div>
               <div class="s_b_ab_u_btnArea">
-                <span @click="sumUpStudent(item)">总结分析</span>
-                <span @click.stop="lookStudentDetail(item)">作业详细</span>
+                <span @click="sumUpStudent(item)">Summary Analysis</span>
+                <span @click.stop="lookStudentDetail(item)">Homework Details</span>
               </div>
             </div>
           </template>
@@ -954,7 +954,7 @@
                 :src="require('../../../assets/icon/course/back.svg')"
                 @click.stop="atTagIndex = 1"
               />
-              <span>学生:{{ lookStudentData.userName }}</span>
+              <span>Student: {{ lookStudentData.userName }}</span>
             </div>
             <div class="s_b_at_studentList">
               <div
@@ -971,7 +971,7 @@
                 </div>
                 <div class="s_b_at_sl_message" v-if="item.type === 3">
                   <div>
-                    题目:
+                    Question:
                     <el-tooltip
                       class="item"
                       effect="light:"
@@ -981,7 +981,7 @@
                     >
                   </div>
                   <div>
-                    答题:
+                    Answer:
                     <span>{{ item.content.answer }}</span>
                   </div>
                 </div>
@@ -995,7 +995,7 @@
                   :key="index1"
                 >
                   <div>
-                    题目:
+                    Question:
                     <el-tooltip
                       class="item"
                       effect="light:"
@@ -1006,7 +1006,7 @@
                   </div>
 
                   <div>
-                    选项:
+                    Options:
                     <span>
                       <div v-for="(item2, index2) in item1.checkList">
                         {{ index2 + 1 }}、{{ item2.src ? item2.src : item2 }}
@@ -1014,10 +1014,10 @@
                     </span>
                   </div>
                   <div>
-                    答案:{{ answerData(item1.checkList, item1.answer) }}
+                    Answer: {{ answerData(item1.checkList, item1.answer) }}
                   </div>
                   <div>
-                    答题:
+                    Answer:
                     <span>{{
                       answerData(item1.checkList, item.content.anwer[index1])
                     }}</span>
@@ -1033,7 +1033,7 @@
                   :key="index1"
                 >
                   <div>
-                    题目:
+                    Question:
                     <el-tooltip
                       class="item"
                       effect="light:"
@@ -1044,7 +1044,7 @@
                   </div>
 
                   <div>
-                    选项:
+                    Options:
                     <span>
                       <div v-for="(item2, index2) in item1.checkList">
                         {{ index2 + 1 }}、{{ item2.src ? item2.src : item2 }}
@@ -1052,7 +1052,7 @@
                     </span>
                   </div>
                   <div>
-                    答题:
+                    Answer:
                     <span>{{
                       answerData(item1.checkList, item.content.anwer[index1])
                     }}</span>
@@ -1074,8 +1074,8 @@
             @keyup.enter.native="send()"
             :placeholder="
               sendFnType == 0
-                ? '请在此输入您想了解的内容'
-                : '请点击录音按钮开始录音'
+                ? 'Please enter the content you want to know here'
+                : 'Please click the recording button to start recording'
             "
             class="s_b_i_left"
             v-model="text"
@@ -1087,7 +1087,7 @@
             v-if="sendFnType == 1 && isTalk"
             :readonly="isReadonly"
             @focus="setCursorToEnd"
-            placeholder="请说话"
+            placeholder="Please speak"
             class="s_b_i_left"
             v-model="text"
             ref="inputEndRef"
@@ -1099,7 +1099,7 @@
             v-loading="loading"
             v-if="sendFnType && !isTalk"
           >
-            <span>点击说话</span>
+            <span>Click to speak</span>
           </div>
 
           <!-- <div class="s_b_i_right" @click="sendFile()">
@@ -1111,7 +1111,7 @@
             v-if="sendFnType == 0 && text == '' && !chatLoading"
             class="item"
             effect="light"
-            content="语音输入"
+            content="Voice input"
             placement="top"
           >
             <span @click.stop="changeFnType(1)">
@@ -1137,7 +1137,7 @@
             v-if="sendFnType == 1 && text == '' && !isTalk"
             class="item"
             effect="light"
-            content="文字输入"
+            content="Text input"
             placement="top"
           >
             <span @click.stop="changeFnType(0)">
@@ -1172,7 +1172,7 @@
             v-if="isTalk"
             class="item"
             effect="light"
-            content="结束录音"
+            content="End recording"
             placement="top"
           >
             <span @click.stop="stopTalk()">
@@ -1199,7 +1199,7 @@
             v-if="sendFnType == 0 && text != '' && !chatLoading"
             class="item"
             effect="light"
-            content="发送"
+            content="Send"
             placement="top"
           >
             <span @click.stop="send()" style="background-color: #3681FC;">
@@ -1222,7 +1222,7 @@
             v-if="chatLoading && sendFnType==0"
             class="item"
             effect="light"
-            content="停止发送"
+            content="Stop Sending"
             placement="top"
           >
             <span @click.stop="stopSend()" style="background-color: #3681FC;">
@@ -1246,7 +1246,7 @@
             v-if="text == '' && !isTalk"
             class="item"
             effect="light"
-            content="语音助手"
+            content="Voice Assistant"
             placement="top"
           >
             <span @click.stop="openPhone">
@@ -1328,7 +1328,7 @@
       <div class="s_b_inputArea" v-if="cardType == 1">
         <div class="s_b_input">
           <el-input
-            placeholder="搜索想要的智能体"
+            placeholder="Search for the intelligent agent you want"
             class="s_b_i_left"
             v-model="roleText"
           ></el-input>
@@ -1341,7 +1341,7 @@
           <el-tooltip
             class="item"
             effect="light"
-            content="查询"
+            content="Search"
             placement="top"
           >
             <span style="background-color: #3681FC;">
@@ -1367,7 +1367,7 @@
     </div>
     <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-      src="https://cloud.cocorobo.hk/browser/public/index.html"
+      src="https://beta.cloud.cocorobo.cn/browser/public/index.html"
       ref="iiframe"
       v-show="false"
     ></iframe>
@@ -1375,7 +1375,7 @@
     <!-- 文字转语音-->
     <iframe
       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-      src="https://cloud.cocorobo.hk/browser/public/index1.html"
+      src="https://beta.cloud.cocorobo.cn/browser/public/index1.html"
       ref="iiframe2"
       v-show="false"
     ></iframe>
@@ -1388,9 +1388,9 @@ import MarkdownIt from "markdown-it";
 import { tools } from "../../../common/tools";
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
-		from:'cn',
-		to:'hk'
-})
+  from: "hk",
+  to: "cn"
+});
 export default {
   props: {
     courseDetail: {
@@ -1451,44 +1451,44 @@ export default {
       source: null,
       saveUid: "",
       toolsList: {
-        58: "模拟驾驶",
-        59: "路径搜索",
-        60: "深度学习",
-        10: "倒计时",
-        65: "挑人",
-        7: "思维网格",
-        1: "电子白板",
-        52: "文档",
-        3: "思维导图",
-        48: "表格",
-        49: "学生分组",
-        4: "问卷调查",
-        45: "选择题",
-        15: "问答",
-        16: "作业提交",
-        50: "批量上传",
-        41: "选择匹配",
-        47: "排序",
-        40: "个人评价",
-        18: "训练平台",
+        58: "Simulated Driving",
+        59: "Path Search",
+        60: "Deep Learning",
+        10: "Countdown",
+        65: "Select Person",
+        7: "Thinking Grid",
+        1: "Electronic Whiteboard",
+        52: "Document",
+        3: "Mind Map",
+        48: "Table",
+        49: "Student Grouping",
+        4: "Survey",
+        45: "Multiple Choice",
+        15: "Q&A",
+        16: "Homework Submission",
+        50: "Batch Upload",
+        41: "Select Match",
+        47: "Sorting",
+        40: "Personal Evaluation",
+        18: "Training Platform",
         21: "AIoT Blockly",
         23: "AI Python",
         24: "AI Blockly",
-        32: "源码编辑",
+        32: "Source Code Editing",
         57: "CocoPi",
-        63: "海龟编程",
-        28: "翻译",
-        31: "数字画板",
+        63: "Turtle Programming",
+        28: "Translation",
+        31: "Digital Drawing Board",
         39: "GeoGebra",
-        66: "公式编辑",
-        67: "分子结构",
-        68: "时间轴",
-        69: "英语写作",
-        70: "英语口语",
-        25: "目标管理",
-        26: "课程设计",
-        62: "交互视频",
-        71: "AI智能体"
+        66: "Formula Editing",
+        67: "Molecular Structure",
+        68: "Timeline",
+        69: "English Writing",
+        70: "English Speaking",
+        25: "Goal Management",
+        26: "Course Design",
+        62: "Interactive Video",
+        71: "AI Agent"
       },
       lookStudentData: {},
       taskList: [],
@@ -1506,7 +1506,7 @@ export default {
       isReadonly: true,
       showTips: false,
 			showTipsList:[],
-			languageSetting:1,
+			languageSetting:0,
 			userName:"",
     };
   },
@@ -1801,9 +1801,9 @@ export default {
     },
     clear() {
       // this.chatList = [];
-      this.$confirm("确定清空聊天记录吗?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
+      this.$confirm("Are you sure you want to clear the chat history?", "Prompt", {
+        confirmButtonText: "Confirm",
+        cancelButtonText: "Cancel",
         type: "warning"
       })
         .then(_ => {
@@ -1819,12 +1819,12 @@ export default {
             .then(res => {
               this.chatList = [];
               this.stopSend();
-              this.$message.success("清除聊天记录成功");
+              this.$message.success("Chat history cleared successfully");
               this.loading = false;
             })
             .catch(err => {
               this.loading = false;
-              this.$message.error("清除聊天记录失败");
+              this.$message.error("Failed to clear chat history");
             });
         })
         .catch(_ => {});
@@ -1843,8 +1843,8 @@ export default {
     },
     send(_text = this.text, val = 0) {
       this.ppage = 1;
-      if (this.loading || this.chatLoading) return this.$message.info("请稍等");
-      if (_text.trim().length == 0) return this.$message.info("请输入内容");
+      if (this.loading || this.chatLoading) return this.$message.info("Please wait");
+      if (_text.trim().length == 0) return this.$message.info("Please enter content");
       let _atRoleList = [];
       if ((this.cardType = 1)) {
         this.cardType = 0;
@@ -1873,7 +1873,7 @@ export default {
       // }
       this.chatList.push({
         role: "user",
-        content: `${this.sendType == 3 ? `帮我生成一张图片:${_text}` : _text}`,
+        content: `${this.sendType == 3 ? `Help me generate an image: ${_text}` : _text}`,
         uid: _uuid,
         AI: "AI",
         aiContent: "",
@@ -1885,11 +1885,11 @@ export default {
         loading: true
       });
       this.scrollBottom();
-      if (this.sendType == 2 || _text.indexOf("视频") != -1) {
-        this.insertMemorandum(`<span class="btn">搜索视频</span>`);
+      if (this.sendType == 2 || _text.indexOf("video") != -1) {
+        this.insertMemorandum(`<span class="btn">Search Video</span>`);
         return this.ajax
           .post(`https://gpt4.cocorobo.cn/get_network_search`, {
-            engine: "youtube",//bilibili    youtube
+            engine: "bilibili",//bilibili    youtube
             keyword: _text
           })
           .then(res => {
@@ -1901,9 +1901,9 @@ export default {
                 .replaceAll('<em class="keyword">', "")
                 .replaceAll("</em>", "");
 								// bilibili👇
-              // _resultText += `名称:${i.title}\n简介:${i.description}\n地址:[${i.arcurl}](${i.arcurl})\n\n`;
+              _resultText += `Name: ${i.title}\nDescription: ${i.description}\nAddress: [${i.arcurl}](${i.arcurl})\n\n`;
 							//youtube👇
-							_resultText += `名称:${i.title}\n简介:${i.description}\n地址:[${i.link}](${i.link})\n\n`;
+							// _resultText += `名称:${i.title}\n简介:${i.description}\n地址:[${i.link}](${i.link})\n\n`;
             });
             this.chatList.find(i => i.uid == _uuid).aiContent = _resultText;
             this.chatList.find(i => i.uid == _uuid).loading = false;
@@ -1913,11 +1913,11 @@ export default {
             this.text = "";
           })
           .catch(e => {
-            this.$message.error("获取视频失败");
+            this.$message.error("Failed to retrieve video");
             this.chatLoading = false;
           });
       } else if (this.sendType == 3) {
-        this.insertMemorandum(`<span class="btn">生成图片</span>`);
+        this.insertMemorandum(`<span class="btn">Generate Image</span>`);
         this.text = "";
         let params = {
           n: 1,
@@ -1950,7 +1950,7 @@ export default {
               this.chatLoading = false;
               this.chatList.pop();
               this.chatList.pop();
-              return this.$message.error("生成图片失败");
+              return this.$message.error("Failed to generate image");
             }
             data.image_url_list.forEach(i => {
               _result.push({
@@ -1971,11 +1971,11 @@ export default {
             this.chatLoading = false;
             this.chatList.pop();
             this.chatList.pop();
-            this.$message.error("生成失败");
+            this.$message.error("Generation failed");
           });
         return;
-      } else if (this.sendType == 1 || _text.indexOf("图片") != -1) {
-        this.insertMemorandum(`<span class="btn">搜索图片</span>`);
+      } else if (this.sendType == 1 || _text.indexOf("image") != -1) {
+        this.insertMemorandum(`<span class="btn">Search Image</span>`);
         // console.log("图片");
 
         this.text = "";
@@ -2023,58 +2023,64 @@ export default {
         return;
       }
       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: "user",
-          //   content: i.content
-          // });
-        } else if (i.content == "addAsk") {
-        }
-        if (i.content) {
-          history.push({
-            type: "text",
-            text: i.content
-          });
-        }
-        if (i.aiContent) {
-          history.push({
-            type: "text",
-            text: i.aiContent
-          });
-        }
-      });
+      // 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: "user",
+      //     //   content: i.content
+      //     // });
+      //   } else if (i.content == "addAsk") {
+      //   }
+      //   if (i.content) {
+      //     history.push({
+      //       type: "text",
+      //       text: i.content
+      //     });
+      //   }
+      //   if (i.aiContent) {
+      //     history.push({
+      //       type: "text",
+      //       text: i.aiContent
+      //     });
+      //   }
+      // });
       // history.pop();
-      if (_msg) {
-        history.push({ type: "text", text: _msg });
-      } else {
-        history.push({ type: "text", text: _text });
-      }
-
-			history = history.map(i=>({
-				type:i.type,
-				text:`Language: ${this.getLang()}
-				Language: ${this.getLang()}
-				Language: ${this.getLang()}
-			${i.text}`
-			}))
+      // if (_msg) {
+      //   history.push({ type: "text", text: _msg });
+      // } else {
+      //   history.push({ type: "text", text: _text });
+      // }
 
+			// history = history.map(i=>({
+			// 	type:i.type,
+			// 	text:`Language: ${this.getLang()}
+			// 	Language: ${this.getLang()}
+			// 	Language: ${this.getLang()}
+			// ${i.text}`
+			// }))
+			let _msg2 = `
+			Language: ${this.getLang()}
+			Language: ${this.getLang()}
+			Language: ${this.getLang()}
+			${_text}
+			`
       let params = {
         assistant_id: this.choseRoleItem
           ? this.choseRoleItem.assistant_id
-          : "f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b",
+          : "b19f1a1a-7586-11ef-8ce0-12e77c4cb76b",
         userId: this.userid,
-        message: history,
+        message: _msg2,
         session_name: `${this.courseId}-studyStudent-md`,
         uid: _uuid,
         file_ids: this.fileId,
-        model: "gpt-4o-mini"
+        // model: "gpt-4o-2024-08-06"
+				model:"gpt-4o-2024-08-06"
       };
       // let params = {
       //   model: "gpt-3.5-turbo",
@@ -2156,7 +2162,7 @@ export default {
 
       _msg = `
 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.if the user speaks Chinese Traditional, the specific text of your answer should also be in Chinese Traditional.
+Language: Please use the same language as the user requirement, if the user speaks English, the specific text of your answer should also be in English.if the user speaks Chinese, the specific text of your answer should also be in Chinese.
 
 ## 目的
 你是用户的课堂助手,你需要基于提供给你的课程相关信息,对用户的提问进行回答。
@@ -2244,7 +2250,7 @@ ${_atList
         session_name: `${this.courseId}-studyStudent-md`,
         uid: _uuid,
         file_ids: this.fileId,
-        model: "gpt-4o-mini"
+        model: "gpt-4o-2024-08-06"
       };
       // let params = {
       //   model: "gpt-3.5-turbo",
@@ -2694,7 +2700,7 @@ Instruction: Based on the context, follow "Format example", write content
         session_name: _uuid,
         // uid: _uuid,
         file_ids: this.fileId,
-        model: "gpt-4o-mini"
+        model: "gpt-4o-2024-08-06"
       };
       // let params = {
       //   message: {
@@ -2807,7 +2813,7 @@ Instruction: Based on the context, follow "Format example", write content
         session_name: _uuid,
         // uid: _uuid,
         file_ids: this.fileId,
-        model: "gpt-4o-mini"
+        model: "gpt-4o-2024-08-06"
       };
       // let params = {
       //   message: {
@@ -3062,7 +3068,7 @@ ${_wordData}
             session_name: `${this.courseId}-studyStudent-md`,
             uid: _uuid,
             file_ids: this.fileId,
-            model: "gpt-4o-mini"
+            model: "gpt-4o-2024-08-06"
           };
           // let params = {
           //   model: "gpt-3.5-turbo",
@@ -3259,7 +3265,7 @@ ${_wordData}
         session_name: `${this.courseId}-studyStudent-md`,
         uid: _uuid,
         file_ids: this.fileId,
-        model: "gpt-4o-mini"
+        model: "gpt-4o-2024-08-06"
       };
       // let params = {
       //     model: "gpt-3.5-turbo",

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 81 - 240
src/components/classRoomHelper/component/taskArea.vue


+ 82 - 82
src/components/classRoomHelper/index.vue

@@ -49,7 +49,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            :content="fold ? '折叠' : '展开'"
+            :content="fold ? 'Collapse' : 'Expand'"
             placement="top"
           >
             <img
@@ -61,7 +61,7 @@
         </div>
 
         <div @click="changeItemType(5)" v-if="tType == 1">
-          <el-tooltip class="item" effect="dark" content="评论" placement="top">
+          <el-tooltip class="item" effect="dark" content="Comment" placement="top">
             <img
               :src="require('../../assets/icon/course/comment2.svg')"
               alt=""
@@ -74,7 +74,7 @@
           @click="startRecording()"
           v-if="!videoStart && (tType == 1 || tType == 4)"
         >
-          <el-tooltip class="item" effect="dark" content="录制" placement="top">
+          <el-tooltip class="item" effect="dark" content="Record" placement="top">
             <img
               :src="require('../../assets/icon/course/record3.svg')"
               alt=""
@@ -88,7 +88,7 @@
           v-else-if="tType == 1 || tType == 4"
           style="background:#f63564"
         >
-          <el-tooltip class="item" effect="dark" content="下载" placement="top">
+          <el-tooltip class="item" effect="dark" content="Download" placement="top">
             <img
               :src="require('../../assets/icon/course/record4.svg')"
               alt=""
@@ -114,7 +114,7 @@
             :src="require('../../assets/icon/course/task.png')"
           />
           <!-- <span :style="`background:url(${itemType==2?require('../../assets/icon/course/task_active.png'):require('../../assets/icon/course/task.png')});`"></span> -->
-          <div>测验</div>
+          <div>Quiz</div>
         </div>
 
         <div
@@ -133,7 +133,7 @@
             :src="require('../../assets/icon/course/up.png')"
           />
           <!-- <span :style="`background:url(${itemType==1?require('../../assets/icon/course/up_active.png'):require('../../assets/icon/course/up.png')});`"></span> -->
-          <div>对话</div>
+          <div>Dialogue</div>
         </div>
 
         <div
@@ -151,12 +151,12 @@
             v-if="itemType != 3"
             :src="require('../../assets/icon/course/Countdown.svg')"
           />
-          <div>倒计时</div>
+          <div>Countdown</div>
         </div>
       </div>
       <div class="ch_nav_box_bottom">
         <div @click.stop="commentAndAnnotate()" style="z-index: 9999;">
-          <el-tooltip class="item" effect="dark" content="批注" placement="top">
+          <el-tooltip class="item" effect="dark" content="Annotation" placement="top">
             <img
               :src="require('../../assets/icon/course/edit2.svg')"
               v-if="!AnnotationCanvasShow"
@@ -169,7 +169,7 @@
 					<el-tooltip
             class="item"
             effect="dark"
-            :content="itemType != 4?'开启语音助手':'关闭语音助手'"
+            :content="itemType != 4?'Enable Voice Assistant':'Disable Voice Assistant'"
             placement="top"
           >
             <img v-if="itemType != 4" :src="require('../../assets/icon/course/robot.svg')" />
@@ -184,7 +184,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            :content="recordType == 0 ? '开启语音助手' : '关闭语音助手'"
+            :content="recordType == 0 ? 'Enable Voice Assistant' : 'Disable Voice Assistant'"
             placement="top"
           >
             <img
@@ -199,7 +199,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            content="上一步"
+            content="Previous Step"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/last.png')" />
@@ -210,7 +210,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            content="下一步"
+            content="Next Step"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/next.png')" />
@@ -221,7 +221,7 @@
           <el-tooltip
             class="item"
             effect="dark"
-            :content="type == 0 ? '展开' : '折叠'"
+            :content="type == 0 ? 'Expand' : 'Collapse'"
             placement="top"
           >
             <img :src="require('../../assets/icon/course/menu.png')" />
@@ -232,17 +232,17 @@
     <div v-if="fold" class="itemFold" ref="itemFoldRef"  v-click-outside="handleBlur">
       <div @click="$emit('backPage')">
           <img :src="require('../../assets/icon/course/return.png')" alt="" />
-				<span>返回</span>
+				<span>Return</span>
       </div>
 
       <div @click="$emit('refresh')">
           <img :src="require('../../assets/icon/course/refresh.png')" alt="" />
-					<span>刷新</span>
+					<span>Refresh</span>
       </div>
 
       <div @click="$emit('authority')" v-if="tType == 1 || tType == 4">
           <img :src="require('../../assets/icon/course/setting2.svg')" alt="" />
-					<span>权限</span>
+					<span>Permissions</span>
       </div>
     </div>
     <levitatedSphere ref="levitatedSphereRef" @startTime="startTime" />
@@ -370,7 +370,7 @@ export default {
 			getWangLoading:false,
 			canUseWangData:false,
 			wangData:"",
-			languageSetting:1,
+			languageSetting:0,
     };
   },
   mounted() {
@@ -425,27 +425,27 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenc
 Instruction: Based on the context, follow "Format example", write content
 
 #Context
-## 任务
-你是专业的教学评估员,擅长分析课堂动态和学生的认知状态,能够根据教师的当前思路提供有效的教学建议。
-你需要根据我提供的信息,推测分析,之后给出3个具体的操作步骤的建议。
-
-##工作流程
-1. 仔细阅读并分析我提供的课堂信息或课堂实录内容。
-2. 观察课堂上学生的行为和反应,推测他们的认知状态。
-3. 通过教师的言行和教学安排,推测教师当前的思路和教学目标。
-4. 根据教师的思路和学生的认知状态,提出一个教学建议,并给出3个具体的操作步骤。只需要描述对应的动作,不需要指出该动作的目标和作用。
-
-##输出
-###输出要求
-1. 最终输出仅包含具体操作步骤。
-2. 具体操作步骤以数组形式输出,包含3个步骤。
-3. 每个步骤用一句话描述,详细一些
-
-##课堂内容
-当前进行到:${nowTask}
-
-##Format example
-["步骤的描述","步骤的描述","步骤的描述"]
+## Task
+You are a professional teaching evaluator, skilled in analyzing classroom dynamics and students' cognitive states, capable of providing effective teaching suggestions based on the teacher's current thinking.
+You need to infer and analyze based on the information I provide, and then give three specific operational steps as suggestions.
+
+## Workflow
+1. Carefully read and analyze the classroom information or classroom transcript I provide.
+2. Observe the students' behaviors and reactions in the classroom to infer their cognitive states.
+3. Infer the teacher's current thinking and teaching objectives through the teacher's words and teaching arrangements.
+4. Based on the teacher's thinking and the students' cognitive states, propose a teaching suggestion and provide three specific operational steps. Just describe the corresponding actions without indicating the goals and effects of those actions.
+
+## Output
+### Output Requirements
+1. The final output should only contain specific operational steps.
+2. The specific operational steps should be output in an array format, containing three steps.
+3. Each step should be described in one sentence, in detail.
+
+## Classroom Content
+Currently proceeding to: ${nowTask}
+
+## Format example
+["Description of the step", "Description of the step", "Description of the step"]
 ${_textData}
 `
 let params = {
@@ -455,8 +455,8 @@ let params = {
         // session_name: uuidv4(),
         // // uid: _uuid,
         // file_ids: this.fileId,
-				// model: "gpt-4o-mini",
-					model: "gpt-4o-mini",
+				// model: "gpt-4o-2024-08-06",
+					model: "gpt-4o-2024-08-06",
 					temperature: 0,
 					max_tokens: 4096,
 					top_p: 1,
@@ -487,7 +487,7 @@ let params = {
         })
         .catch(e => {
           this.showTipsLoading = false;
-          this.$message.error("获取课堂小贴士失败");
+          this.$message.error("Failed to get classroom tips");
           console.log(e);
         });
 			})
@@ -501,12 +501,12 @@ let params = {
     },
     startRecording() {
       this.$emit("startRecording");
-      this.insertMemorandum(`使用<span class="btn">录制</span>功能,录制课堂`);
+      this.insertMemorandum(`Using <span class="btn">record</span> function to record the class`);
     },
     insertMemorandum(_html) {
-      //保存行为操作
-      //variable
-      //btn
+      // Save action operation
+      // variable
+      // btn
       let params = [
         {
           uid: this.userid,
@@ -522,13 +522,13 @@ let params = {
         )
         .then(res => {
           if (res.data == 1) {
-            console.log("保存操作成功");
+            console.log("Save operation successful");
           } else {
-            console.log("保存操作失败");
+            console.log("Save operation failed");
           }
         })
         .catch(e => {
-          console.log("保存操作失败");
+          console.log("Save operation failed");
           console.log(e);
         });
     },
@@ -557,7 +557,7 @@ let params = {
 				return;
 			}
 			this.openSetting();
-      // this.$message.info("切换到"+type)
+      // this.$message.info("Switched to "+type)
       this.$nextTick(() => {
         // if (this.itemType == 1 && type != 1) {
         //   this.$refs.searchAreaRef.scrollBottom();
@@ -569,16 +569,16 @@ let params = {
         // }
         this.itemType = type;
         if (this.itemType == 4 && this.recordType == 1) {
-          //关闭悬浮语音助手
+          // Close the floating voice assistant
           this.$refs.levitatedSphereRef.stopRecord();
         }
 
         if (this.itemType == 3) {
-          this.insertMemorandum(`打开<span class="btn">倒计时</span>面板`);
+          this.insertMemorandum(`Open <span class="btn">countdown</span> panel`);
         }
       });
     },
-    //计时
+    // Timing
     startTime(time) {
       this.$refs.timepieceRef.startTime(time);
     },
@@ -622,18 +622,18 @@ let params = {
       });
     },
     startAssistant() {
-      if (this.recordLoading) return this.$message.info("请稍等...");
+      if (this.recordLoading) return this.$message.info("Please wait...");
       this.recordLoading = true;
       if (this.recordType == 0) {
         if (this.itemType == 4) {
           this.itemType = 0;
           this.type = 0;
         }
-        // this.$message.info("开启")
+        // this.$message.info("Started")
         // this.changeRecordType(1)
         this.$refs.levitatedSphereRef.recordStart();
       } else if (this.recordType == 1) {
-        // this.$message.info("关闭")
+        // this.$message.info("Stopped")
         this.$refs.levitatedSphereRef.stopTwo();
 				// this.changeRecordType(0)
       }
@@ -641,14 +641,14 @@ let params = {
     changeMegaphone() {
       this.openMegaphone = !this.openMegaphone;
       if (this.openMegaphone) {
-        this.$message.success("已开启AI语音");
+        this.$message.success("AI voice has been turned on");
       } else {
-        this.$message.success("已关闭AI语音");
+        this.$message.success("AI voice has been turned off");
       }
     },
-    // 展开
+    // Expand
     changeFold(newValue) {
-      // this.$message.info("展开");
+      // this.$message.info("Expand");
       this.fold = newValue;
 			this.$nextTick(()=>{
 				let e1 = this.$refs.foldBtnRef.getBoundingClientRect();
@@ -659,19 +659,19 @@ let params = {
 			this.$refs.itemFoldRef.style.top = e1.top - e2.top + "px";
 			})
     },
-    // 收起
+    // Collapse
     changeUnfold(newValue) {
-      // this.$message.info("收起");
+      // this.$message.info("Collapse");
       this.fold = newValue;
     },
-    // 语音识别
+    // Voice recognition
     startRecord() {
       this.$refs.levitatedSphereRef.startRecord();
     },
     stopRecord() {
       this.$refs.levitatedSphereRef.stopTwo();
     },
-    // 语音合成
+    // Voice synthesis
     startSpeak() {
     },
     changeRecordType(type) {
@@ -683,12 +683,12 @@ let params = {
 				this.$refs.AnnotationCanvasRef.close()
 			}else{
 				this.$refs.AnnotationCanvasRef.open();
-      	this.insertMemorandum(`开始使用<span class="btn">批注</span>功能`);
+      	this.insertMemorandum(`Start using <span class="btn">annotation</span> function`);
 			}
       
     },
     endCommentAndAnnotate() {
-      this.insertMemorandum(`结束使用<span class="btn">批注</span>功能`);
+      this.insertMemorandum(`End using <span class="btn">annotation</span> function`);
     },
 		getWantSearch() {
 			console.log("获取猜你想搜")
@@ -701,27 +701,27 @@ Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content
 
-## 任务
-你的任务是根据“课程信息”,提供用户需要的搜索建议,将搜索建议的结果以有序列表的形式返回给用户。
-## 课程信息
-#### 课程标题:${this.courseDetail.title ? this.courseDetail.title : ""}
-#### 分类:${this.courseDetail.name ? this.courseDetail.name : "无"}
-#### 学生年级:${
-        this.courseDetail.classname ? this.courseDetail.classname : ""
+## Task
+Your task is to provide users with search suggestions based on "course information" and return the results in an ordered list format.
+## Course Information
+#### Course Title: ${this.courseDetail.title ? this.courseDetail.title : ""}
+#### Category: ${this.courseDetail.name ? this.courseDetail.name : "None"}
+#### Student Grade: ${
+        this.courseDetail.classname ? this.courseDetail.classname : "None"
       }
 
-## 规则
-输出结果基于“课程信息”,避免提供无关的信息。
-搜索建议的结果符合伦理规范。
-## 输出
-输出应包括6个相关的搜索建议,每个搜索建议需要以问号的方式结束。
-请一步步思考如何根据现有信息推送搜索建议,但是不需要输出搜索建议以外的内
+## Rules
+The output results are based on "course information" and should avoid providing irrelevant information.
+The search suggestions must comply with ethical standards.
+## Output
+The output should include 6 relevant search suggestions, each ending with a question mark.
+Please think step by step about how to push search suggestions based on the existing information, but do not output anything other than search suggestions.
 
-## 输出格式
-搜索建议应以有序列表形式呈现,每个建议包括关键词和简短描述。输出JSON格式的
+## Output Format
+Search suggestions should be presented in an ordered list format, with each suggestion including keywords and a brief description. Output in JSON format.
 
 ## Format example
-[{"index": 1,"title": "垃圾分类标准","label": "不同国家的垃圾分类标准和方法?"},{"index": 2,"title":"可回收垃圾处理","label": "可回收垃圾的处理流程和再利用方法?"},{  "index": 3,  "title": "有害垃圾的影响",  "label": "有害垃圾对环境和人体健康的潜在影响?"},{  "index": 4,  "title": "垃圾分类标准",  "label": "不同国家的垃圾分类标准和方法?"},{  "index": 5,  "title": "可回收垃圾处理",  "label": "可回收垃圾的处理流程和再利用方法?"},{  "index": 6,  "title": "有害垃圾的影响",  "label": "有害垃圾对环境和人体健康的潜在影响?"}]
+[{"index": 1,"title": "Waste Classification Standards","label": "What are the waste classification standards and methods in different countries?"},{"index": 2,"title":"Recyclable Waste Processing","label": "What are the processing procedures and reuse methods for recyclable waste?"},{  "index": 3,  "title": "Impact of Hazardous Waste",  "label": "What are the potential impacts of hazardous waste on the environment and human health?"},{  "index": 4,  "title": "Waste Classification Standards",  "label": "What are the waste classification standards and methods in different countries?"},{  "index": 5,  "title": "Recyclable Waste Processing",  "label": "What are the processing procedures and reuse methods for recyclable waste?"},{  "index": 6,  "title": "Impact of Hazardous Waste",  "label": "What are the potential impacts of hazardous waste on the environment and human health?"}]
 `;
 
       // let params = {
@@ -742,7 +742,7 @@ Instruction: Based on the context, follow "Format example", write content
         session_name: _uuid,
         // uid: _uuid,
         file_ids: this.fileId,
-        model: "gpt-4o-mini"
+        model: "gpt-4o-2024-08-06"
       };
       // let params = {
       //   message: {

+ 50 - 0
src/components/components/eChartsView.vue

@@ -0,0 +1,50 @@
+<template>
+  <div class="chart" id="charts_canvas" ref="chartRef"></div>
+</template>
+
+<script>
+import * as echarts from "echarts";
+// import "echarts-wordcloud";
+export default {
+  props: {
+    data: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      chartObj: null,
+      chartData: null
+    };
+  },
+  watch: {
+    data() {
+      this.getChartData();
+    }
+  },
+  methods: {
+    getChartData() {
+      if (this.chartObj === null) {
+        this.chartObj = echarts.init(this.$refs.chartRef);
+      }
+      this.chartObj.setOption(this.data);
+      window.addEventListener("resize", () => {
+        this.chartObj.resize();
+      });
+    }
+  },
+  mounted() {
+    this.getChartData();
+  }
+};
+</script>
+
+<style scoped>
+.chart {
+  max-width: 100%;
+  width: 100%;
+  height: 100%;
+  background-color: #fff;
+}
+</style>

+ 808 - 0
src/components/components/statisticalAnalysis.vue

@@ -0,0 +1,808 @@
+<template>
+  <div class="statisticalAnalysis">
+    <el-dialog
+      :visible.sync="show"
+      width="100%"
+      height="100%"
+      fullscreen
+      :modal="true"
+      :close-on-click-modal="false"
+      :show-close="false"
+    >
+      <div class="s_box">
+        <div class="s_b_top">
+          <div class="s_b_t_left">
+            <img src="../../assets/icon/thirdToolList/ask.png" alt="Image"/>
+            <div class="s_b_t_l_detail">
+              <div>{{ askData.title }}</div>
+              <span>{{ askData.describe }}</span>
+            </div>
+          </div>
+          <div class="s_b_t_right" @click="close">
+            <svg
+              t="1730691027130"
+              class="icon"
+              viewBox="0 0 1024 1024"
+              version="1.1"
+              xmlns="http://www.w3.org/2000/svg"
+              p-id="4288"
+              width="200"
+              height="200"
+            >
+              <path
+                d="M632.117978 513.833356l361.805812 361.735298a85.462608 85.462608 0 1 1-121.001515 120.789974L511.116463 634.552816 146.913186 998.756094a86.026718 86.026718 0 0 1-121.706652-121.706652L389.480325 512.775651 27.674513 150.969839A85.392095 85.392095 0 0 1 148.393973 30.250379L510.199785 392.056191l366.671258-366.671258a86.026718 86.026718 0 0 1 121.706652 121.706652z"
+                p-id="4289"
+              ></path>
+            </svg>
+            <span>Exit</span>
+          </div>
+        </div>
+        <div class="s_b_bottom">
+          <div class="s_b_b_left">
+            <span
+              @click="changeShowType(0)"
+              :class="{ s_b_b_l_active: showType === 0 }"
+              >Question Situation</span
+            >
+            <span
+              @click="changeShowType(1)"
+              :class="{ s_b_b_l_active: showType === 1 }"
+              >Student Summary</span
+            >
+            <span
+              @click="changeShowType(2)"
+              :class="{ s_b_b_l_active: showType === 2 }"
+              >Class Summary</span
+            >
+          </div>
+          <div class="s_b_b_right">
+						<div class=s_b_b_r_btnArea>
+							<div class="s_b_b_r_primaryBtn" @click="refresh">Refresh</div>
+						</div>
+            <div class="s_b_b_r_item" v-if="showType === 0">
+              <div class="itemBox">
+                <div class="ib_title">Data Statistics Chart</div>
+                <div class="ib_echarts" style="width:60%;height: 600px;min-width: 600px;">
+                  <eChartsView
+										id="problemSituationData"
+                    v-if="problemSituationData.eChartsOption && show "
+                    :data="problemSituationData.eChartsOption"
+                  />
+                </div>
+              </div>
+
+              <div class="itemBox">
+                <div class="ib_title">Data Details</div>
+                <el-table
+                  v-if="problemSituationData.tableData.length > 0"
+                  :data="problemSituationData.tableData"
+                  border
+                  style="width: 100%"
+                >
+                  <el-table-column
+                    type="index"
+                    width="50"
+                    align="center"
+                  ></el-table-column>
+                  <el-table-column
+                    prop="label"
+                    width="100"
+                    align="center"
+                  ></el-table-column>
+                  <el-table-column
+                    v-for="(item, index) in problemSituationData.tableData[0]
+                      .options"
+                    width="70"
+                    :key="index"
+                    :label="`Option ${index + 1}`"
+                    align="center"
+                  >
+                    <template slot-scope="scope">
+                      <div>
+                        {{ scope.row.options[index] }}
+                      </div>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </div>
+            <div class="s_b_b_r_item" v-if="showType === 1">
+              <div class="itemBox">
+                <div class="ib_title">Data Statistics Chart</div>
+                <div class="ib_echarts" style="width:60%;height: 600px;min-width: 600px;">
+                  <eChartsView2
+										id="studentSummaryData"
+                    v-if="studentSummary.eChartsOption && show"
+                    :data="studentSummary.eChartsOption"
+                  />
+                </div>
+              </div>
+
+              <div class="itemBox">
+                <div class="ib_title">Data Details</div>
+                <el-table
+                  v-if="studentSummary.tableData.length > 0"
+                  :data="studentSummary.tableData"
+                  border
+                  style="width: 100%"
+                >
+                  <el-table-column
+                    type="index"
+                    width="50"
+                    align="center"
+                  ></el-table-column>
+                  <el-table-column
+                    prop="label"
+                    width="100"
+                    align="center"
+                  ></el-table-column>
+                  <el-table-column
+                    v-for="(item, index) in studentSummary.tableData[0].options"
+                    width="70"
+                    :key="index"
+                    :label="`Option ${index + 1}`"
+                    align="center"
+                  >
+                    <template slot-scope="scope">
+                      <div>
+                        {{ scope.row.options[index] }}
+                      </div>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </div>
+
+            <div class="s_b_b_r_item" v-if="showType === 2">
+              <div class="itemBox">
+                <div class="ib_title">Data Statistics Chart</div>
+                <div class="ib_echarts" style="width:800px;height: 600px">
+                  <eChartsView3
+										id="classSummaryData"
+                    v-if="classSummary.eChartsOption && show"
+                    :data="classSummary.eChartsOption"
+                  />
+                </div>
+              </div>
+
+              <div class="itemBox">
+                <div class="ib_title">Data Details</div>
+                <el-table
+                  v-if="classSummary.tableData.length > 0"
+                  :data="classSummary.tableData"
+                  border
+                  style="width: 100%"
+                >
+                  <el-table-column
+                    type="index"
+                    :index="indexMethod"
+                    width="50"
+                    align="center"
+                  ></el-table-column>
+                  <el-table-column
+                    prop="label"
+                    width="100"
+                    align="center"
+                  ></el-table-column>
+                  <el-table-column
+                    v-for="(item, index) in classSummary.tableData[0].options"
+                    width="70"
+                    :key="index"
+                    :label="`Option ${index + 1}`"
+                    align="center"
+                  >
+                    <template slot-scope="scope">
+                      <div>
+                        {{ scope.row.options[index] }}
+                      </div>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import eChartsView from "./eChartsView.vue";
+import eChartsView2 from "./eChartsView.vue";
+import eChartsView3 from "./eChartsView.vue";
+export default {
+  components: {
+    eChartsView,
+    eChartsView2,
+    eChartsView3
+  },
+  data() {
+    return {
+      show: false,
+      showType: 0,
+      data: null,
+      tType: null,
+      worksData: null,
+      worksStudent: null,
+			toolIndex:null,
+      askData: {
+        title: "",
+        describe: ""
+      }
+    };
+  },
+  methods: {
+    open(data) {
+			console.log(data)
+      this.show = true;
+      this.data = data;
+      this.worksStudent = data.worksStudent;
+			this.toolIndex = data.toolIndex;
+      if (data.worksStudent.length > 0) {
+        let works = data.worksStudent[0].works
+          ? JSON.parse(data.worksStudent[0].works)
+          : null;
+        if (works) {
+          works = works[0].askJson;
+          this.worksData = works.askJson;
+          this.askData.title = works.askTitle;
+        } else {
+          this.worksData = [];
+        }
+      } else {
+        this.worksData = [];
+      }
+    },
+    close() {
+      this.show = false;
+      this.init();
+    },
+    init() {
+      this.data = null;
+      this.showType = 0;
+      this.tType = null;
+      this.worksData = null;
+			this.toolIndex = null;
+      this.askData = {
+        title: "",
+        describe: ""
+      };
+    },
+    changeShowType(type) {
+      this.showType = type;
+			this.$forceUpdate()
+    },
+    indexMethod(index) {
+      if (index === 0) {
+        return "";
+      } else {
+        return index;
+      }
+    },
+		refresh(){
+			this.$emit("refresh",this.toolIndex)
+		},
+		refreshData(data){
+			console.log(data)
+			this.data = data;
+      this.worksStudent = data.worksStudent;
+			this.toolIndex = data.toolIndex;
+      if (data.worksStudent.length > 0) {
+        let works = data.worksStudent[0].works
+          ? JSON.parse(data.worksStudent[0].works)
+          : null;
+        if (works) {
+          works = works[0].askJson;
+          this.worksData = works.askJson;
+          this.askData.title = works.askTitle;
+        } else {
+          this.worksData = [];
+        }
+      } else {
+        this.worksData = [];
+      }
+		},
+  },
+  computed: {
+    // 题目情况
+    problemSituationData() {
+      let result = {
+        eChartsOption: {
+          legend: {
+            selectedMode: false
+          },
+          grid: {
+            left: 100,
+            right: 100,
+            top: 50,
+            bottom: 50
+          },
+          yAxis: {
+            type: "category",
+            data: []
+          },
+          xAxis: {
+            type: "value",
+            axisLabel: {
+              formatter: function(value) {
+                return value * 100 + "%"; // 将值转换为百分比
+              }
+            }
+          },
+          series: {}
+        },
+        tableData: []
+      };
+
+      if (this.worksData === null || this.worksData.length === 0) {
+        return result;
+      }
+
+      // 获取题目选项最多的长度
+      let optionsLength = 0;
+
+      this.worksData.forEach((item, index) => {
+        if (item.checkList.length > optionsLength) {
+          optionsLength = item.checkList.length;
+        }
+        let itemObj = {
+          label: `Question ${index + 1}`,
+          question: item.askTitle,
+          options: []
+        };
+
+        result.tableData.push(itemObj);
+      });
+
+      //填充选项次数
+      result.tableData.forEach(item => {
+        item.options = new Array(optionsLength).fill(0);
+      });
+
+      this.worksStudent.forEach((item, index) => {
+        let works = item.works ? JSON.parse(item.works) : null;
+        if (works) {
+          let answer = works[0].anwer;
+          answer.forEach((item2, index2) => {
+            if (Array.isArray(item2)) {
+              item2.forEach(item3 => result.tableData[index2].options[item3]++);
+            } else if (typeof item2 === "number") {
+              result.tableData[index2].options[item2]++;
+            }
+          });
+        }
+      });
+
+      result.eChartsOption.yAxis.data = result.tableData
+        .map(item => item.label)
+        .reverse();
+
+      let optionsDataList = result.tableData.map(i => i.options).reverse();
+
+      let totalData = [];
+      let endwaysData = [];
+
+      optionsDataList.forEach((item, index) => {
+        totalData.push(item.reduce((a, b) => a + b, 0));
+
+        for (let i = 0; i < item.length; i++) {
+          if (!endwaysData[i]) {
+            endwaysData[i] = [];
+          }
+          endwaysData[i].push(item[i]);
+        }
+      });
+
+      let series = result.tableData[0].options.map((item, index) => {
+        return {
+          name: `Option ${index + 1}`,
+          type: "bar",
+          stack: "total",
+          barWidth: "60%",
+          label: {
+            show: true,
+            formatter: params => {
+              let data = Math.round(params.value * 1000) / 10;
+              if (data === 0) {
+                return "";
+              } else {
+                return data + "%";
+              }
+            }
+          },
+          data: endwaysData[index].map((d, did) => {
+            return totalData[did] <= 0 ? 0 : d / totalData[did];
+          })
+        };
+      });
+
+      result.eChartsOption.series = series;
+
+      return result;
+    },
+    //学生汇总
+    studentSummary() {
+      let result = {
+        eChartsOption: {
+          legend: {
+            selectedMode: false
+          },
+          grid: {
+            left: 100,
+            right: 100,
+            top: 50,
+            bottom: 50
+          },
+          yAxis: {
+            type: "category",
+            data: []
+          },
+          xAxis: {
+            type: "value",
+            axisLabel: {
+              formatter: function(value) {
+                return value * 100 + "%"; // 将值转换为百分比
+              }
+            }
+          },
+          series: {}
+        },
+        tableData: []
+      };
+
+      if (this.worksData === null || this.worksData.length === 0) {
+        return result;
+      }
+
+      // 获取题目选项最多的长度
+      let optionsLength = 0;
+
+      this.worksData.forEach((item, index) => {
+        if (item.checkList.length > optionsLength) {
+          optionsLength = item.checkList.length;
+        }
+      });
+
+      this.worksStudent.forEach((item, index) => {
+        let works = item.works ? JSON.parse(item.works) : null;
+        let obj = {
+          label: `${item.sName}`,
+          index: index,
+          options: new Array(optionsLength).fill(0)
+        };
+        if (works) {
+          let answer = works[0].anwer;
+          answer.forEach((item2, index2) => {
+            if (Array.isArray(item2)) {
+              item2.forEach(item3 => obj.options[item3]++);
+              // item2.forEach(item3 => result.tableData[index2].options[item3]++);
+            } else if (typeof item2 === "number") {
+              obj.options[item2]++;
+              // result.tableData[index2].options[item2]++;
+            }
+          });
+          result.tableData.push(obj);
+        }
+      });
+
+      result.eChartsOption.yAxis.data = result.tableData
+        .map(item => item.label)
+        .reverse();
+
+      let optionsDataList = result.tableData.map(i => i.options).reverse();
+
+      let totalData = [];
+      let endwaysData = [];
+
+      optionsDataList.forEach((item, index) => {
+        totalData.push(item.reduce((a, b) => a + b, 0));
+
+        for (let i = 0; i < item.length; i++) {
+          if (!endwaysData[i]) {
+            endwaysData[i] = [];
+          }
+          endwaysData[i].push(item[i]);
+        }
+      });
+
+      let series = result.tableData[0].options.map((item, index) => {
+        return {
+          name: `Option ${index + 1}`,
+          type: "bar",
+          stack: "total",
+          barWidth: "60%",
+          label: {
+            show: true,
+            formatter: params => {
+              let data = Math.round(params.value * 1000) / 10;
+              if (data === 0) {
+                return "";
+              } else {
+                return data + "%";
+              }
+            }
+          },
+          data: endwaysData[index].map((d, did) => {
+            return totalData[did] <= 0 ? 0 : d / totalData[did];
+          })
+        };
+      });
+
+      result.eChartsOption.series = series;
+
+      return result;
+    },
+    //班级汇总
+    classSummary() {
+      let result = {
+        eChartsOption: {
+          tooltip: {
+            trigger: "item"
+          },
+          legend: {
+            top: "5%",
+            left: "center"
+          },
+          series: [
+            {
+              type: "pie",
+              radius: ["40%", "70%"],
+              name: "Class Summary",
+              avoidLabelOverlap: false,
+              padAngle: 0,
+              itemStyle: {
+                borderRadius: 10
+              },
+              label: {
+                formatter: "{b}: {c} people",
+                fontSize: 30
+              },
+              labelLine: {
+                show: true
+              },
+              data: []
+            }
+          ]
+        },
+        tableData: []
+      };
+
+      // 获取题目选项最多的长度
+      let optionsLength = 0;
+
+      this.worksData.forEach((item, index) => {
+        if (item.checkList.length > optionsLength) {
+          optionsLength = item.checkList.length;
+        }
+        let itemObj = {
+          label: `Question ${index + 1}`,
+          question: item.askTitle,
+          options: []
+        };
+
+        result.tableData.push(itemObj);
+      });
+
+      //填充选项次数
+      result.tableData.forEach(item => {
+        item.options = new Array(optionsLength).fill(0);
+      });
+
+      this.worksStudent.forEach((item, index) => {
+        let works = item.works ? JSON.parse(item.works) : null;
+        if (works) {
+          let answer = works[0].anwer;
+          answer.forEach((item2, index2) => {
+            if (Array.isArray(item2)) {
+              item2.forEach(item3 => result.tableData[index2].options[item3]++);
+            } else if (typeof item2 === "number") {
+              result.tableData[index2].options[item2]++;
+            }
+          });
+        }
+      });
+
+      let totalData = {
+        label: "Total",
+        question: "Total",
+        options: new Array(optionsLength).fill(0)
+      };
+
+      result.tableData.forEach(i => {
+        i.options.forEach((i2, index2) => {
+          totalData.options[index2] += i2;
+        });
+      });
+
+      result.tableData.unshift(totalData);
+
+
+			totalData.options.forEach((item,index)=>{
+				let obj = {
+					value:item,
+					name:`Option ${index+1}`
+				}
+				result.eChartsOption.series[0].data.push(obj)
+			})
+			
+			
+
+      return result;
+    }
+  }
+};
+</script>
+
+<style scoped>
+.statisticalAnalysis {
+  width: 100vw;
+  height: 100vh;
+}
+
+.statisticalAnalysis >>> .el-dialog__header,
+.statisticalAnalysis >>> .el-dialog__footer {
+  display: none; /* 隐藏头部和底部 */
+}
+
+.statisticalAnalysis >>> .el-dialog__body {
+  padding: 0;
+  margin: 0;
+  height: 100vh;
+  width: 100vw;
+  overflow: auto;
+}
+
+.s_box {
+  width: 100%;
+  height: 100%;
+}
+
+.s_b_top {
+  width: 100%;
+  height: 100px;
+  display: flex;
+  justify-content: space-between;
+  align-self: center;
+  box-sizing: border-box;
+  border-bottom: 1px solid #dee0e3;
+}
+
+.s_b_t_left {
+  flex: 1;
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+
+.s_b_t_left > img {
+  width: 80px;
+  height: 80px;
+  margin-left: 20px;
+}
+
+.s_b_t_l_detail {
+  width: 100%;
+  height: 70px;
+  box-sizing: border-box;
+  padding: 10px 20px;
+}
+
+.s_b_t_l_detail > div {
+  font-size: 18px;
+  font-weight: bold;
+}
+
+.s_b_t_l_detail > span {
+  font-size: 16px;
+  color: #beb4b4;
+  display: block;
+  margin-top: 5px;
+}
+
+.s_b_t_right {
+  width: 100px;
+  height: 50px;
+  margin: auto;
+  margin-right: 40px;
+  margin-left: 20px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+}
+
+.s_b_t_right > svg {
+  width: 18px;
+  height: 18px;
+  margin-right: 10px;
+  fill: #000;
+  cursor: pointer;
+}
+
+.s_b_t_right > span {
+  font-size: 20px;
+  font-weight: bold;
+  color: #000;
+  cursor: pointer;
+}
+
+.s_b_bottom {
+  width: 100%;
+  height: calc(100% - 100px);
+  display: flex;
+}
+
+.s_b_b_left {
+  width: 300px;
+  height: 100%;
+  box-sizing: border-box;
+  border-right: 1px solid #beb4b4;
+  padding-top: 20px;
+}
+
+.s_b_b_left > span {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  font-size: 22px;
+  margin-top: 20px;
+  box-sizing: border-box;
+  padding-left: 50px;
+}
+
+.s_b_b_l_active {
+  font-weight: bold;
+}
+
+.s_b_b_right {
+  width: calc(100% - 300px);
+  height: 100%;
+	position: relative;
+}
+
+.s_b_b_r_btnArea{
+	width: auto;
+	height: auto;
+	position: absolute;
+	right: 30px;
+	top: 30px;
+}
+
+.s_b_b_r_primaryBtn{
+	width: auto;
+	height: auto;
+	background-color: #007AFF;
+	
+	color: #fff;
+	font-size: 16px;
+	padding: 10px 30px;
+	border-radius: 25px;
+	cursor: pointer;
+	box-shadow: 0px 2px 5px 0px #1D398314;
+
+box-shadow: 0.5px 0.5px 10px 2px #1D39830D;
+
+}
+
+.s_b_b_r_item {
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+  padding: 20px;
+}
+
+.itemBox {
+  width: 100%;
+  height: auto;
+  margin-bottom: 40px;
+}
+
+.ib_title {
+  font-size: 24px;
+  /* font-weight: bold; */
+  margin-bottom: 20px;
+}
+</style>

+ 4 - 4
src/components/easy2/commpont/evaTable.vue

@@ -9,7 +9,7 @@
           stripe
           style="width: 100%"
         >
-          <el-table-column label="素养" align="center">
+          <el-table-column label="Competence" align="center">
             <template slot-scope="scope">
               <div
                 style="display:flex;justify-content: center;align-items: center;"
@@ -27,7 +27,7 @@
             </template></el-table-column
           >
 
-          <el-table-column label="评价标准" align="center">
+          <el-table-column label="Evaluation Criteria" align="center">
             <template slot-scope="scope"
               ><div>
                 {{ scope.row.detail != "" ? scope.row.detail : "-" }}
@@ -35,7 +35,7 @@
             >
           </el-table-column>
 
-          <el-table-column label="细则" align="center">
+          <el-table-column label="Details" align="center">
             <template slot-scope="scope"
               ><div
                 style="display:flex;justify-content: space-around;margin:auto"
@@ -47,7 +47,7 @@
                     style="white-space:pre-wrap"
                   ></div>
                   <div slot="reference" style="color:#4383FF;cursor: pointer;">
-                    查看
+                    View
                   </div>
                 </el-popover>
               </div>

+ 42 - 38
src/components/easy2/commpont/markDialog.vue

@@ -6,12 +6,12 @@
       <div class="left">
         <div v-loading="ScLoading">
           <div class="scoreTit">
-            <div>任务得分</div>
+            <div>Task Score</div>
             <div>
               <span style="color: #4380F8;margin-right: 3px;">{{
                 totalScore ? totalScore : 0
               }}</span
-              >
+              >points
             </div>
           </div>
           <div class="allD" :style="{ marginLeft: isMarkSco ? '0' : '17px' }">
@@ -38,7 +38,7 @@
                       {{ e.detail }}
                     </div>
                   </el-tooltip>
-                  <el-rate @change="submit" v-model="e.cog"></el-rate>
+                  <el-rate :disabled="tType == 2" disabled-void-color @change="submit" v-model="e.cog"></el-rate>
                 </div>
               </div>
               <div
@@ -63,7 +63,7 @@
                       {{ e.detail }}
                     </div>
                   </el-tooltip>
-                  <el-rate @change="submit" v-model="e.cog"></el-rate>
+                  <el-rate :disabled="tType == 2" disabled-void-color @change="submit" v-model="e.cog"></el-rate>
                 </div>
               </div>
             </div>
@@ -73,22 +73,23 @@
               class="scoreStar2"
               @click="revealBtn"
             >
-              折叠 <i class="el-icon-arrow-up"></i>
+              Collapse <i class="el-icon-arrow-up"></i>
             </div>
             <div
               v-if="!reveal && scoTitList.length > 3"
               class="scoreStar2"
               @click="revealBtn"
             >
-              全部 <i class="el-icon-arrow-down"></i>
+              All <i class="el-icon-arrow-down"></i>
             </div>
           </div>
           <div class="AreaCss">
             <el-input
               type="textarea"
-              placeholder="您可在此输入评语"
+              :placeholder="tType == 1 ?'You can enter comments here':'No comments available'"
               v-model="textarea"
               @blur="submit"
+              :disabled="tType == 2"
             >
             </el-input>
             <div
@@ -97,12 +98,12 @@
                   currentUid.type == 10 ||
                   currentUid.type == 13 ||
                   isMarkCom == 1) &&
-                  !isMarkSco
+                  !isMarkSco && tType == 1
               "
               class="anewC"
               @click="anewEva"
             >
-              重新生成
+              Regenerate
             </div>
           </div>
 
@@ -111,13 +112,13 @@
           >
             <div></div>
 
-            <div style="display: flex;">
+            <div style="display: flex;" v-if="tType == 1">
               <div
                 class="ScrBtn"
                 @click="reset"
                 style="color: rgba(0, 0, 0, 0.6);background-color: rgba(243, 247, 253, 1);border: none;"
               >
-                清空
+                Clear
               </div>
 
               <div
@@ -135,7 +136,7 @@
                 <img
                   src="../../../assets/icon/newIcons/rootImg.png"
                   alt=""
-                />AI评分
+                />AI Scoring
               </div>
               <div
                 class="ScrBtn"
@@ -152,18 +153,19 @@
                 <img
                   src="../../../assets/icon/newIcons/rootImg.png"
                   alt=""
-                />AI评分
+                />AI Scoring
               </div>
             </div>
           </div>
         </div>
 
-        <!-- 提交列表 -->
+        <!-- Submission List -->
         <div
+          v-if="tType == 1"
           style="flex: 1;display: flex;flex-direction: column;overflow: auto;"
         >
           <div class="workListTit" @click="workListTitBtn">
-            <i class="el-icon-arrow-down"></i>提交列表 ({{ workList.length }})
+            <i class="el-icon-arrow-down"></i>Submission List ({{ workList.length }})
           </div>
           <div style="overflow: auto;flex: 1;">
             <div
@@ -191,7 +193,7 @@
                   <span
                     style="font-size: 14px;color:rgba(0, 0, 0, 0.4);"
                     v-if="i.markSco == null"
-                    >未评分</span
+                    >Not Scored</span
                   >
                   <span
                     v-else
@@ -207,7 +209,7 @@
       </div>
     </div>
 
-    <!-- 作业展示区 -->
+    <!-- Homework Display Area -->
     <div class="Rig">
       <div class="RigTop">
         <div
@@ -237,51 +239,48 @@
               <div class="Timer">{{ currentUid.time }}</div>
             </div>
           </div>
-          <div class="cutStuBtn">
+          <div v-if="tType == 1" class="cutStuBtn">
             <div>
               <span v-if="current == 0" style="cursor: pointer;color:#ccc"
-                >上一个</span
+                >Previous</span
               >
               <span
                 v-else
                 @click="prevStu"
                 style="cursor: pointer;color: rgba(54, 129, 252, 1)"
-                >上一个</span
+                >Previous</span
               >
             </div>
             <div>
               <span
                 v-if="current >= workList.length - 1"
                 style="cursor: pointer;color: #ccc"
-                >下一个</span
+                >Next</span
               >
               <span
                 v-else
                 @click="nextStu"
                 style="cursor: pointer;color: rgba(54, 129, 252, 1)"
-                >下一个</span
+                >Next</span
               >
             </div>
-            <!-- <div><span @click="prevStu" v-if="this.current > 0">上一个</span></div>
-            <div><span @click="nextStu" v-if="this.current < this.workList.length-1">下一个</span></div> -->
           </div>
         </div>
       </div>
       <div class="RigConTit">
         <div :class="[cutNum ? '' : 'RigConTitOn']" @click="cutPage(0)">
-          学生作业
+          Student Homework
         </div>
         <div :class="[cutNum ? 'RigConTitOn' : '']" @click="cutPage(1)">
-          点赞与评论
+          Likes and Comments
         </div>
       </div>
       <div class="RigCon">
-        <!-- 作业内容  -->
+        <!-- Homework Content  -->
         <div v-if="cutNum == 0" style="height: 97%;">
           <div
             v-if="
               currentUid.type == 13 || currentUid.type == 10
-              // currentUid.type == 15
             "
           >
             <div class="cont" v-html="currentUid.content.text"></div>
@@ -336,7 +335,7 @@
               "
             >
               <img src="../../../assets/icon/codeFile.png" />
-              <div>点击打开CocoPi</div>
+              <div>Click to open CocoPi</div>
             </div>
           </div>
           <div v-if="currentUid.type == 5" style="height: 100%;">
@@ -349,14 +348,14 @@
             ></video-player>
           </div>
         </div>
-        <!-- 点赞与评论  -->
+        <!-- Likes and Comments  -->
         <div v-if="cutNum == 1">
           <div style="display: flex;align-items: center;">
             <img
               style="margin-right: 3px;"
               src="../../../assets/icon/newIcons/likeG.png"
               alt=""
-            />点赞({{ likeList.length }})
+            />Likes ({{ likeList.length }})
           </div>
           <div class="likeList">
             <div v-for="i in likeList" :key="i.id">{{ i.username }}</div>
@@ -366,7 +365,7 @@
               style="margin-right: 3px;"
               src="../../../assets/icon/newIcons/commG.png"
               alt=""
-            />评论({{ commentList.length }})
+            />Comments ({{ commentList.length }})
           </div>
           <div class="commentListCss" v-if="commentList.length">
             <div
@@ -396,7 +395,7 @@
                 <span
                   style="color: #3B7BD7;cursor: pointer;"
                   @click="deleteComment(i.id)"
-                  >删除</span
+                  >Delete</span
                 >
               </div>
             </div>
@@ -460,7 +459,9 @@ export default {
     "markScoreworksStudent",
     "languageSetting",
     "taskDetail",
-    "tool"
+    "tool",
+    "tType",
+    "sIsOpen"
   ],
   data() {
     return {
@@ -501,7 +502,7 @@ export default {
         ],
         // poster: require("../../../assets/tu31.png"), //你的封面地址
         // poster: dataRes.imgUrl, //你的封面地址
-        notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
+        notSupportedMessage: "This video cannot be played at the moment, please try again later", // Allows overriding the default message displayed when Video.js cannot play the media source.
         controlBar: {
           timeDivider: true, //当前时间和持续时间的分隔符
           durationDisplay: true, //显示持续时间
@@ -708,7 +709,7 @@ export default {
         userId: this.cUserid,
         file_ids: _fileid ? [_fileid] : [],
         isImage: this.currentUid.type == 1 ? true : "",
-        model: "gpt-4o-mini"
+        model: "gpt-4o-2024-08-06"
       };
       this.ajax
         .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params)
@@ -1036,6 +1037,8 @@ export default {
 
     // ai打分
     aiGet2(messages, _fileid, work) {
+      if (!this.markScoreVisible) return console.log('弹框关闭了');
+
       let _this = this;
 
       let params = {
@@ -1050,7 +1053,7 @@ export default {
         userId: this.cUserid,
         file_ids: _fileid ? [_fileid] : [],
         isImage: work.type == 1 ? true : "",
-        model: "gpt-4o-mini"
+        model: _fileid ? "gpt-4o-2024-08-06"  : "gpt-4o-2024-08-06"
       };
       this.ajax
         .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params)
@@ -1666,6 +1669,7 @@ export default {
 .AreaCss >>> .el-textarea__inner {
   min-height: 150px !important;
   /* max-height: 150px; */
+  color: #606266;
   padding-bottom: 20px;
 }
 .AreaBtn {
@@ -1925,7 +1929,7 @@ export default {
   background-color: #fff;
   bottom: 3px;
   right: 22px;
-  color: #12b0ff;
+  color: #3681FC;
   cursor: pointer;
   font-size: 14px;
   transform: translate(0px, 2px);

+ 10 - 8
src/components/easy2/commpont/markScore.vue

@@ -2,8 +2,8 @@
   <div>
     <div v-loading="loading" style="cursor: pointer;" @click.stop="markScoreDigBtn">
       <div class="scoreTit">
-        <div>任务得分</div>
-        <div>{{ totalScore ? totalScore : 0 }}</div>
+        <div>Task Score</div>
+        <div>{{ totalScore ? totalScore : 0 }} points</div>
       </div>
       <div class="allD">
         <div class="scoreStarBack2">
@@ -47,17 +47,17 @@
         <!-- <el-input
           type="textarea"
           disabled
-          placeholder="您可在此输入评语"
+          placeholder="You can enter comments here"
           v-model="textarea"
           style="padding-bottom: 10px;"
         >
         </el-input> -->
       </div>
       <!-- <div style="width:100%;display:flex;justify-content: flex-end;">
-        <el-button size="mini" @click="reset">重置</el-button>
-        <el-button type="primary" size="mini" @click="submit">确认</el-button>
+        <el-button size="mini" @click="reset">Reset</el-button>
+        <el-button type="primary" size="mini" @click="submit">Confirm</el-button>
         <el-button type="primary" size="mini" @click="AIsubmit"
-          >AI评分</el-button
+          >AI Scoring</el-button
         >
       </div> -->
     </div>
@@ -77,7 +77,8 @@ export default {
     "loading",
     "wIndex",
     "toolIndex",
-    "tool"
+    "tool",
+    "markScoreVisible"
   ],
 
   data() {
@@ -270,6 +271,7 @@ export default {
 
     // ai循环评分
     async aiupdetaSco(messages, uid, stage, task,_fileid,work) {
+      
       let _this = this;
       let params = {
         assistant_id: "6063369f-289a-11ef-8bf4-12e77c4cb76b",
@@ -283,7 +285,7 @@ export default {
         userId: this.userid,
         file_ids: _fileid ? [_fileid] : [],
         isImage: work == 0 ? true : '',
-        model: "gpt-4o-mini"
+        model:  _fileid ? "gpt-4o-2024-08-06"  : "gpt-4o-2024-08-06"
       };
       return new Promise((resolve,reject) => {
         this.ajax

+ 15 - 15
src/components/easy2/commpont/onlineWrite.vue

@@ -1,11 +1,11 @@
 <template>
   <div class="engBox">
     <div class="engTitle">
-      <div>作文题目:</div>
+      <div>Essay Title:</div>
       <div>{{ englishList.engTitle }}</div>
     </div>
     <div class="engText">
-      <div>作文内容:</div>
+      <div>Essay Content:</div>
       <div class="cont" v-html="englishList.englishText"></div>
     </div>
 
@@ -22,28 +22,28 @@
       </div>
     </div>
 
-    <div class="chooseUpload" @click="type = 1" v-if="type == 0">+在线编写</div>
+    <div class="chooseUpload" @click="type = 1" v-if="type == 0">+ Online Writing</div>
     <div
       class="chooseUpload"
       @click="uploadDialogVisible = true"
       v-if="type == 0"
     >
-      +图片上传
+      + Image Upload
     </div>
 
     <div class="loadingImageText" v-if="type == 1">
       <div class="ftypeBox">
         <div class="ftypeTitle">
-          <div>标题:</div>
+          <div>Title:</div>
           <div>
             <el-input
               v-model="myAnswerList.engTitle"
-              placeholder="请填写你的作文题目"
+              placeholder="Please fill in your essay title"
             ></el-input>
           </div>
         </div>
         <div class="ftypeText">
-          <div>正文:</div>
+          <div>Content:</div>
           <div>
             <el-input
               type="textarea"
@@ -61,7 +61,7 @@
     </div>
 
     <el-dialog
-      title="图片上传"
+      title="Image Upload"
       :visible.sync="uploadDialogVisible"
       :append-to-body="true"
       width="30%"
@@ -75,7 +75,7 @@
       >
         <div class="up_photo2">
           <img src="../../../assets/icon/plwork1.png" alt />
-          <span>点击上传文件</span>
+          <span>Click to upload file</span>
         </div>
         <input
           type="file"
@@ -93,10 +93,10 @@
           <img src="../../../assets/icon/english/delete.png" alt="" />
         </div>
       </div>
-      <div style="text-align: center">如已进行填写,确认后讲清空内容噢。</div>
+      <div style="text-align: center">If you have filled in, please confirm to clear the content.</div>
       <span slot="footer" class="dialog-footer">
-        <el-button @click="checkImage">取 消</el-button>
-        <el-button type="primary" @click="uploadIsType">确定</el-button>
+        <el-button @click="checkImage">Cancel</el-button>
+        <el-button type="primary" @click="uploadIsType">Confirm</el-button>
       </span>
     </el-dialog>
   </div>
@@ -206,7 +206,7 @@ export default {
             [file.name.split(".").length - 1].toLocaleUpperCase()
         ) == -1
       ) {
-        _this.$message.error("请上传图片!");
+        _this.$message.error("Please upload an image!");
         return;
       }
 
@@ -241,7 +241,7 @@ export default {
             if (err) {
               var a = _this.$refs.upload1.uploadFiles;
               a.splice(a.length - 1, a.length);
-              _this.$message.error("上传失败");
+              _this.$message.error("Upload failed");
             } else {
               // _this.$message.success('上传成功')
               _this.myAnswerList.imgList.push({
@@ -326,7 +326,7 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenc
             res.data.FunctionResponse.result &&
             res.data.FunctionResponse.result == "无效请求,请重新发起对话"
           ) {
-            this.$message.error("你的作文内容太长,无法使用图片识别!");
+            this.$message.error("Your essay content is too long to use image recognition!");
             loading.close();
             return;
           }

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 281 - 125
src/components/easy2/studyStudent.vue


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 152 - 148
src/components/easy3/studyStudent.vue


+ 21 - 22
src/components/index.vue

@@ -12,16 +12,16 @@
       </div>
       <div class="reBox">
         <div class="reTop">
-          <div>课程</div>
+          <div>Course</div>
           <div>
             <div class="search" @click="search">
               <img src="../assets/icon/search.png" alt="" />
             </div>
-            <input class="sInput" type="text" placeholder="请输入关键字" v-model="sCourse" @keyup.enter="search"/>
+            <input class="sInput" type="text" placeholder="Please enter keywords" v-model="sCourse" @keyup.enter="search"/>
           </div>
         </div>
         <div class="pType_box all_choose"  v-if="oid == '69893dca-1d47-11ed-8c78-005056b86db5'">
-          <span>类型</span>
+          <span>Type</span>
           <el-radio-group v-model="pTypeCheckName" style="display: flex; align-items: center">
             <div class="all_choose" style="width: 100px" v-for="(item, index) in CourseType3" :key="index">
               <el-radio :label="item.name" @click.native.prevent="CourseType2Click(item.name)">{{
@@ -43,7 +43,7 @@
                                   : true)">
               <div class="cName" @click="getCourse(item.name, '', item.id, 1)"
                 :class="typeE.indexOf(item.id) != -1 ? 'isCType' : ''">
-                全部
+                All
               </div>
               <div v-for="(item1, index1) in CourseTypeJson[item.id]" :key="index + '-' + index1" :label="item1.id"
                 @click="getCourse(item.name, item.id, item1.id, 2)">
@@ -61,7 +61,7 @@
       </div>
       <div class="body_student" v-loading="loading">
         <div class="typeCheck">
-          <el-switch v-model="typeCheck"></el-switch><span>分类显示</span>
+          <el-switch v-model="typeCheck"></el-switch><span>Category Display</span>
         </div>
         <div>
           <div class="main_box">
@@ -105,7 +105,7 @@
                       <div>{{ item.typename }}</div>
                     </el-tooltip>
 
-                    <div>{{ JSON.parse(item.chapters).length }}阶段</div>
+                    <div>{{ JSON.parse(item.chapters).length }} stages</div>
                   </div>
                   <div class="school_box">
                     <el-tooltip effect="light" :content="item.school" placement="top">
@@ -134,7 +134,7 @@
                     screenType
                   )
                 ">
-                  立即学习
+                  Start Learning Now
                 </div>
               </div>
             </div>
@@ -180,8 +180,7 @@
                         <el-tooltip class="typeN" effect="light" :content="item.typename" placement="top">
                           <div>{{ item.typename }}</div>
                         </el-tooltip>
-
-                        <div>{{ JSON.parse(item.chapters).length }}阶段</div>
+                        <div>{{ JSON.parse(item.chapters).length }} stages</div>
                       </div>
                       <div class="school_box">
                         <el-tooltip effect="light" :content="item.school" placement="top">
@@ -210,14 +209,14 @@
                         screenType
                       )
                     ">
-                      立即学习
+                      Start Learning
                     </div>
                   </div>
                 </div>
               </div>
             </div>
             <div class="course_empty" v-if="zoneClass.length == 0">
-              暂无课程
+              No courses available
             </div>
           </div>
         </div>
@@ -395,7 +394,7 @@ export default {
             }
           }
         }
-      } else if (typeid == "34629bcc-d02f-11ec-8c78-005056b86db5" || ftypeId == '34629bcc-d02f-11ec-8c78-005056b86db5') {
+      } else if (typeName == "主题") {
         if (type == 1) {
           if (this.typeE.indexOf(typeid) != -1) {
              if(this.oid == '69893dca-1d47-11ed-8c78-005056b86db5'){
@@ -583,7 +582,7 @@ export default {
           if (noTypeCourse.length > 0 && !this.pTypeCheckName.length) {
             CourseType2.push({
               course: noTypeCourse,
-              name: '其他'
+              name: 'Others'
             })
           }
           CourseType2 = CourseType2.filter(item => {
@@ -711,7 +710,7 @@ export default {
       let params = {
         org: this.org && this.org != "" ? this.org : "",
         oid: this.oid && this.oid != "" ? this.oid : "",
-        stand: "hk"
+        stand: "cn"
       };
       this.ajax
         .get(this.$store.state.api + "selectAllTypeStand", params)
@@ -722,9 +721,9 @@ export default {
           this.CourseTypeJson = {};
           this.CourseType = res.data;
           this.CourseType3 = [
-            { name: "智见课程", id: [] },
-            { name: "智行课程", id: [] },
-            { name: "智创课程", id: [] },
+            { name: "Smart Insight Course", id: [] },
+            { name: "Smart Action Course", id: [] },
+            { name: "Smart Creation Course", id: [] },
           ];
 
           for (var cti = 0; cti < res.data[0].length; cti++) {
@@ -740,11 +739,11 @@ export default {
               this.CourseType3[2].id.push(res.data[0][cti].id);
             }
             if(res.data[0][cti].id == "34628934-d02f-11ec-8c78-005056b86db5" || res.data[0][cti].id == "34628934-d02f-11ec-8c78-005056b86ac5"){
-              res.data[0][cti].name = "年级";
+              res.data[0][cti].name = "Grade";
             }else if(res.data[0][cti].id == "34629907-d02f-11ec-8c78-005056b86db5" || res.data[0][cti].id == "34629907-d02f-11ec-8c78-005056b86ac5"){
-              res.data[0][cti].name = "学科";
+              res.data[0][cti].name = "Subject";
             }else if(res.data[0][cti].id == "34629bcc-d02f-11ec-8c78-005056b86db5"){
-              res.data[0][cti].name = "主题";
+              res.data[0][cti].name = "Theme";
             }
           }
           for (var i = 0; i < res.data[0].length; i++) {
@@ -756,7 +755,7 @@ export default {
             }
             if (this.oid == "69893dca-1d47-11ed-8c78-005056b86db5") {
               if (res.data[0][i].name == "栏目") {
-                this.CourseType[0][i].name = "主题";
+                this.CourseType[0][i].name = "Theme";
               }
             }
 
@@ -809,7 +808,7 @@ export default {
         }
         if (this.oid == "69893dca-1d47-11ed-8c78-005056b86db5") {
           if (res.data[0][i].name == "栏目") {
-            this.CourseType[0][i].name = "主题";
+            this.CourseType[0][i].name = "Theme";
           }
         }
         for (var j = 0; j < res.data[1].length; j++) {

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 144 - 140
src/components/studyStudent.vue


Vissa filer visades inte eftersom för många filer har ändrats