Przeglądaj źródła

合并beta最新分支

11wqe1 5 dni temu
rodzic
commit
ec12d66a93

+ 77 - 13
src/components/components/appStoreC.vue

@@ -71,26 +71,34 @@ import { myMixin } from "@/mixins/mixin.js"
                     document.msExitFullscreen();
                 }
             },
-            uploadWork(){
+            async uploadWork(){
                 // console.log('window.exposed_outputs',window.exposed_outputs);
                 let _iframe = this.$refs.appStore;
                 console.log('sStudent',this.userId);
-                
-                // window.exposed_outputs
-                let Cow = JSON.stringify(_iframe.contentWindow.exposed_outputs)
 
                 if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
                 this.homeWorkLoading = true
+                // window.exposed_outputs
+                // let Cow = _iframe.contentWindow.exposed_outputs
+
+                const pptJsonStr = JSON.stringify(_iframe.contentWindow.exposed_outputs);
+                const pptJsonFile = new File([pptJsonStr], "pptData.json", { type: "application/json" });
+                // 你可以根据需要将pptJsonFile上传或保存
+
+                let Cow = await this.uploadFile(pptJsonFile);
+                // console.log(_url)
+                // return
+                
                 let params = [
                     {
-                    uid: this.userId,
-                    cid: this.id,
-                    stage: this.courseType,
-                    task: this.taskCount,
-                    tool: this.toolindex,
-                    content: Cow,
-                    type: 20,
-                    atool:72
+                        uid: this.userId,
+                        cid: this.id,
+                        stage: this.courseType,
+                        task: this.taskCount,
+                        tool: this.toolindex,
+                        content: Cow,
+                        type: 20,
+                        atool:72
                     }
                 ];
                 this.ajax
@@ -119,7 +127,63 @@ import { myMixin } from "@/mixins/mixin.js"
                         this.$message.error("提交失败");
                         console.error(err);
                     });
-            }
+            },
+            //上传文件
+            uploadFile(file) {
+                return new Promise((resolve)=>{
+                    var credentials = {
+                    accessKeyId: "AKIATLPEDU37QV5CHLMH",
+                    secretAccessKey: "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"
+                }; //秘钥形式的登录上传
+                window.AWS.config.update(credentials);
+                window.AWS.config.region = "cn-northwest-1"; //设置区域
+
+                var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
+                var _this = this;
+
+                if (file) {
+                    var params = {
+                    Key:
+                        file.name.split(".")[0] +
+                        new Date().getTime() +
+                        "." +
+                        file.name.split(".")[file.name.split(".").length - 1],
+                    ContentType: file.type,
+                    Body: file,
+                    "Access-Control-Allow-Credentials": "*",
+                    ACL: "public-read"
+                    }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
+                    var options = {
+                    partSize: 2048 * 1024 * 1024,
+                    queueSize: 2,
+                    leavePartsOnError: true
+                    };
+                    bucket
+                    .upload(params, options)
+                    .on("httpUploadProgress", function(evt) {
+                        //这里可以写进度条
+                        // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
+                    })
+                    .send(function(err, data) {
+                        if (err) {
+                        // var a = _this.$refs.upload1.uploadFiles;
+                        // a.splice(a.length - 1, a.length);
+                        _this.$message.error("上传失败ppt数据失败");
+                        } else {
+                        //上传成功处理
+                        // _this.unitJson[_this.unitIndex].chapterInfo[0].fileList1.push({
+                        //   name: file.name,
+                        //   url: data.Location,
+                        //   uid: file.uid
+                        // });
+                        // _this.imgChange();
+                        // console.log(data.Location);
+                        resolve(data.Location)
+                        }
+                    });
+                }
+                })
+            },
         },  
     }
 </script>

+ 110 - 17
src/components/components/choseWorksDetailDialog.vue

@@ -4,6 +4,7 @@
       :visible.sync="show"
       width="100%"
       height="100%"
+      style="overflow: hidden;"
       fullscreen
       :modal="true"
       :close-on-click-modal="false"
@@ -56,7 +57,9 @@
                       v-if="[72].includes(toolType)"
                     @click="upLoadApp">作业提交</el-button>
                   </div>
-                  <span v-if="testData.toolDetail"><span v-html="renderedFormula(testData.toolDetail)"></span></span>
+                  <span v-if="testData.toolDetail" class="renderedFor">
+                    <span v-html="renderedFormula(testData.toolDetail)"></span>
+                  </span>
 									<span v-else>无</span>
                 </div>
 
@@ -84,7 +87,10 @@
                         >
                           (多选题)
                         </div>
-                        <div style="display: flex;align-items: center;">题目:<span v-html="renderedFormula(item1.teststitle)"></span></div>
+                        <div style="display: flex;" class="renderedFor">
+                          <span style="flex-shrink: 0;">题目:</span>
+                          <span v-html="renderedFormula(item1.teststitle)"></span>
+                        </div>
                       </div>
                       <img
                         v-if="item1.img"
@@ -1023,7 +1029,7 @@
                   v-for="(item, index) in tableData"
                   :key="index + 'q3'"
                 >
-                  <div class="s_b_m_b_i_m_c_title">
+                  <div class="s_b_m_b_i_m_c_title renderedFor" >
                     <span>{{ index + 1 }}</span>
                     <svg
                       width="16"
@@ -1039,13 +1045,13 @@
                     </svg>
 
                     <span
-                    style="display: flex;align-items: center;"
-                      >{{
-                        typeof item.answer === "number"
-                          ? "单选题:"
-                          : "多选题:"
-                      }}<span v-html="renderedFormula(item.title)"></span></span
-                    >
+                      style="display: flex;align-items: center;"
+                        >{{
+                          typeof item.answer === "number"
+                            ? "单选题:"
+                            : "多选题:"
+                        }}<span v-html="renderedFormula(item.title)"></span></span
+                      >
                   </div>
 
 									<div class="s_b_m_b_i_m_c_accuracyRate">
@@ -1182,7 +1188,7 @@
 
                         <template v-if="[45].includes(toolType)">
                           <span v-for="(answer,answerIndex) in worksCheckAnswer(item)" :key="item.userid+'-'+answerIndex+'-'+answer.index">
-                            
+
                             <template v-if="answer.type===1">
                               <span  v-for="(item2,indP) in answer.label" :key="indP +'indP'">
                                 <span :class="`${item2.right?'answerRight':'answerWrong'}`">{{ item2.label }}</span>
@@ -1198,7 +1204,7 @@
 
                           </span>
                         </template>
-												
+
 
                         <div class="answerSelect "  v-if="[57].includes(toolType)">
                           <!-- <img style="width: 300px;" src="../../assets/icon/word2.png" /> -->
@@ -1776,16 +1782,27 @@ export default {
         let answerData = []
         let num = 0
         allData.testJson.testJson.forEach(e=>{
-          answerData.push(e.answer)
+          let _answer = e.answer;
+          if(typeof _answer == 'object'){
+            _answer.sort((a,b)=>a-b)
+          }
+          answerData.push(_answer)
         })
 
+        allData.anwer.forEach(e=>{
+          if(typeof e == 'object'){
+            e.sort((a,b)=>a-b)
+          }
+        })
+
+
         answerData.forEach((e,i)=>{
           if (JSON.stringify(e) == JSON.stringify(allData.anwer[i])) {
             num++
           }
         })
 
-        let et = ((num / answerData.length).toFixed(1)) * 100
+        let et = ((num / answerData.length) * 100).toFixed(1)
 				return  et+'%';
 			}
     }
@@ -1911,14 +1928,18 @@ export default {
   methods: {
 
     // 提交应用中心作业
-    upLoadApp(){
+    async upLoadApp(){
       let _iframe = this.$refs.appStore;
       document.getElementById('loadLi_JieE').children[0].style.display = "block"
 
 
         // window.exposed_outputs
-        let Cow = JSON.stringify(_iframe.contentWindow.exposed_outputs)
+        // let Cow = JSON.stringify(_iframe.contentWindow.exposed_outputs)
+        const pptJsonStr = JSON.stringify(_iframe.contentWindow.exposed_outputs);
+        const pptJsonFile = new File([pptJsonStr], "pptData.json", { type: "application/json" });
+        // 你可以根据需要将pptJsonFile上传或保存
 
+        let Cow = await this.uploadFile(pptJsonFile);
         // uid: this.userId,
         //       cid: this.id,
         //       stage: this.courseType,
@@ -1969,6 +1990,62 @@ export default {
                this.addOp3('1', "", { courseid: this.id,tool: 'AI应用',data: Cow,type: "course_tool_sub" }, err)
 
             });
+    },
+        //上传文件
+    uploadFile(file) {
+        return new Promise((resolve)=>{
+            var credentials = {
+            accessKeyId: "AKIATLPEDU37QV5CHLMH",
+            secretAccessKey: "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"
+        }; //秘钥形式的登录上传
+        window.AWS.config.update(credentials);
+        window.AWS.config.region = "cn-northwest-1"; //设置区域
+
+        var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
+        var _this = this;
+
+        if (file) {
+            var params = {
+            Key:
+                file.name.split(".")[0] +
+                new Date().getTime() +
+                "." +
+                file.name.split(".")[file.name.split(".").length - 1],
+            ContentType: file.type,
+            Body: file,
+            "Access-Control-Allow-Credentials": "*",
+            ACL: "public-read"
+            }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
+            var options = {
+            partSize: 2048 * 1024 * 1024,
+            queueSize: 2,
+            leavePartsOnError: true
+            };
+            bucket
+            .upload(params, options)
+            .on("httpUploadProgress", function(evt) {
+                //这里可以写进度条
+                // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
+            })
+            .send(function(err, data) {
+                if (err) {
+                // var a = _this.$refs.upload1.uploadFiles;
+                // a.splice(a.length - 1, a.length);
+                _this.$message.error("上传失败ppt数据失败");
+                } else {
+                //上传成功处理
+                // _this.unitJson[_this.unitIndex].chapterInfo[0].fileList1.push({
+                //   name: file.name,
+                //   url: data.Location,
+                //   uid: file.uid
+                // });
+                // _this.imgChange();
+                // console.log(data.Location);
+                resolve(data.Location)
+                }
+            });
+        }
+        })
     },
     // 设置分组
     updateGroupJson(){
@@ -4388,9 +4465,10 @@ ol {
 }
 
 .a_add_head >>> .katex {
-  font-size: 16px;
+  font-size: 14px;
   width: 100%;
   white-space: normal;
+  font-family: '黑体' !important;
 }
 .a_add_head >>> .katex .base{
   display: inline !important;
@@ -4401,4 +4479,19 @@ ol {
     white-space: normal !important;
     display: inline !important;
 }
+.renderedFor >>> .katex {
+  font-size: 18px;
+  width: 100%;
+  white-space: normal;
+  font-family: '黑体' !important;
+}
+.renderedFor >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
+
+.renderedFor>>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
+}
 </style>

+ 92 - 10
src/components/components/cocoFlowDia.vue

@@ -15,7 +15,7 @@
             </div>
            
             <div class="markDialog">
-                <template v-if="listData.length && listData[0].messages.length">
+                <template v-if="listData.length && showListData(listData)">
                     <div v-for="(item,index) in listData" :key="index">
                         <div class="BodyCon" v-if="item.messages.length"  >
                             <div class="BodyConTit">节点{{ index + 1}}</div>
@@ -51,7 +51,45 @@
 
 <script>
 import MarkdownIt from "markdown-it";
-
+const getFile = url => {
+  return new Promise((resolve, reject) => {
+    var credentials = {
+      accessKeyId: "AKIATLPEDU37QV5CHLMH",
+      secretAccessKey: "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"
+    }; //秘钥形式的登录上传
+    window.AWS.config.update(credentials);
+    window.AWS.config.region = "cn-northwest-1"; //设置区域
+    let url2 = url;
+    let _url2 = "";
+    if (
+      url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+    ) {
+      _url2 = url2.split(
+        "https://view.officeapps.live.com/op/view.aspx?src="
+      )[1];
+    } else {
+      _url2 = url2;
+    }
+    var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+    let name = decodeURIComponent(
+      _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+    );
+    var params = {
+      Bucket: "ccrb",
+      Key: name
+    };
+    s3.getObject(params, function(err, data) {
+      if (err) {
+        console.log(err, err.stack);
+        resolve({ data: 1 });
+      } else {
+        const fileContent = data.Body.toString("utf-8");
+        resolve({ data: fileContent });
+      } // sxuccessful response
+    });
+    // axios({
+  });
+};
     export default {
         data() {
             return {
@@ -62,16 +100,40 @@ import MarkdownIt from "markdown-it";
             }
         },
         computed: {
+            showListData(){
+                return function (val) {
+                   let kk = val.map(e=> e.messages).flat()
+                   console.log('kk',kk);
+                   if (kk.length == 0) {
+                    return false
+                   }
+                   return true
+                };
+            },
             MarkdownT() {
                 return function (c) {
+                    
                     let md = new MarkdownIt({
-  html: true, // 允许渲染 HTML
-  linkify: true, // 自动将URL链接转化为可点击链接
-  typographer: true, // 启用排版规则(如替换 `"` 为 “)
-});
-                    return c
-                    ? md.render(c) : "";
-                };
+                        html: true, // 允许渲染 HTML
+                        linkify: true, // 自动将URL链接转化为可点击链接 
+                        typographer: true, // 启用排版规则(如替换 `"` 为 “)
+                    });
+                    const renderedContent = c ? md.render(c) : "";
+
+                    // 使用正则表达式替换链接
+                    const result = renderedContent.replace(/<a href="([^"]+)">([^<]*)<\/a>/g, (match, url, text) => {
+                        // 判断链接是否为图片格式
+                        if (/\.(png|jpg|jpeg|gif|bmp|svg)$/i.test(url)) {
+                            // 返回<img>标签
+                            return `<img src="${url}" alt="${text}" />`;
+                        } else {
+                            // 返回原来的<a>标签
+                            return match;
+                        }
+                    });
+
+                    return result;
+                }
             }
         },
         methods: {
@@ -79,8 +141,20 @@ import MarkdownIt from "markdown-it";
             markFullScreenBtn() {
                 this.markfullscreen = !this.markfullscreen;
             },
-            openAppWork(val){
+            async openAppWork(val){
                 console.log(val);
+                // val.works = 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/pptData1764063222122.json'
+                
+                // let kk = 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/pptData1764063222122.json'
+
+                // console.log('this.isValidURL(val.works)',this.isValidURL(val.works));
+                
+                if (this.isValidURL(val.works)) {
+                    await getFile(val.works).then((res) => {
+                       val.works = res.data;
+                    });
+                }
+
                 this.username = val.sName
                 try {
                     this.listData = JSON.parse(val.works)
@@ -89,6 +163,14 @@ import MarkdownIt from "markdown-it";
                 }
                 this.FlowVisible = true;
             },
+            isValidURL(str){
+                try {
+                        const url = new URL(str);
+                        return ['http:', 'https:', 'ftp:'].includes(url.protocol) && !!url.hostname;
+                } catch (e) {
+                    return false;
+                }
+            },
             handleClose(){
                 this.listData = []
                 this.FlowVisible = false;

+ 57 - 1
src/components/components/studentWorkPreviewDialog.vue

@@ -309,6 +309,45 @@
 import MarkdownIt from "markdown-it";
 import katex from 'katex'
 import 'katex/dist/katex.min.css'
+const getFile = url => {
+  return new Promise((resolve, reject) => {
+    var credentials = {
+      accessKeyId: "AKIATLPEDU37QV5CHLMH",
+      secretAccessKey: "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"
+    }; //秘钥形式的登录上传
+    window.AWS.config.update(credentials);
+    window.AWS.config.region = "cn-northwest-1"; //设置区域
+    let url2 = url;
+    let _url2 = "";
+    if (
+      url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+    ) {
+      _url2 = url2.split(
+        "https://view.officeapps.live.com/op/view.aspx?src="
+      )[1];
+    } else {
+      _url2 = url2;
+    }
+    var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+    let name = decodeURIComponent(
+      _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+    );
+    var params = {
+      Bucket: "ccrb",
+      Key: name
+    };
+    s3.getObject(params, function(err, data) {
+      if (err) {
+        console.log(err, err.stack);
+        resolve({ data: 1 });
+      } else {
+        const fileContent = data.Body.toString("utf-8");
+        resolve({ data: fileContent });
+      } // sxuccessful response
+    });
+    // axios({
+  });
+};
 export default {
   components: {},
   data() {
@@ -380,13 +419,30 @@ export default {
     };
   },
   methods: {
-    open({ work, testData, testJson, tool }) {
+    async open({ work, testData, testJson, tool }) {
+
+      console.log('work',work);
+      if (this.isValidURL(work.works) && tool == '72') {
+          await getFile(work.works).then((res) => {
+              work.works = res.data;
+          });
+      }
+      
+
       this.studentWork = work;
       (this.testData = testData),
         (this.testJson = testJson),
         (this.tool = tool);
       this.show = true;
     },
+    isValidURL(str){
+      try {
+              const url = new URL(str);
+              return ['http:', 'https:', 'ftp:'].includes(url.protocol) && !!url.hostname;
+      } catch (e) {
+          return false;
+      }
+    },
     close() {
       this.show = false;
       (this.studentWork = null),

+ 216 - 52
src/components/courseDetail.vue

@@ -47,8 +47,8 @@
             <div class="right_box">
               <div class="rightT">
                 <div class="right_box_title">{{ courseDetail.title }}</div>
-                <div class="jd">{{ chapInfo.length }}阶段</div>
-                <div class="jd">{{ rw }}任务</div>
+                <div class="jd" v-if="courseDetail.state!=7">{{ chapInfo.length }}阶段</div>
+                <div class="jd" v-if="courseDetail.state!=7">{{ rw }}任务</div>
               </div>
               <div class="cType" v-if="courseType.length">
                 <div
@@ -144,7 +144,7 @@
                 <div
                   class="now_study"
                   @click="setQr(courseDetail.courseId)"
-                  v-if="tType != 2"
+                  v-if="tType != 2 && courseDetail.state!=7"
                 >
                   <div class="returnIndexImg">
                     <img src="../assets/icon/newIcon/codeIcon.png" alt="" />
@@ -169,19 +169,18 @@
                     }}
                   </div>
                 </div>
-                <div class="now_study" @click="exportCourse" v-if="tType != 2">
+                <!-- <div class="now_study" @click="exportCourse" v-if="tType != 2">
                   <div class="returnIndexImg">
                     <img src="../assets/icon/newIcon/CourseInfo.png" alt="" />
                   </div>
                   <div>导出信息</div>
                 </div>
-                <!--  -->
                 <div class="now_study" @click="uploadCourse" v-if="tType != 2">
                   <div class="returnIndexImg">
                     <img src="../assets/icon/newIcon/uploadCourse.png" alt="" />
                   </div>
                   <div>导出文件</div>
-                </div>
+                </div> -->
                 <!-- <div
                   class="now_group"
                   v-if="groupInfo && courseDetail.state == 1"
@@ -206,23 +205,23 @@
           <div class="sLeft" v-if="courseDetail.brief">
             <div class="courseT">
               <span>课程详情</span>
-              <div class="r_pub_button_op" v-if="(courseDetail.state == 6 || courseDetail.state == 5) && courseDetail.userid == userid" @click="aiChatContent">优化</div> 
+              <div class="r_pub_button_op" v-if="(courseDetail.state == 6 || courseDetail.state == 5) && courseDetail.userid == userid" @click="aiChatContent">优化</div>
             </div>
             <div v-loading="elLoading" element-loading-text="小可正在努力生成中,请稍等..." ref="chatDialog" class="courseTd vditor-reset" v-html="brief"></div>
           </div>
           <div :class="courseDetail.brief != '' ? 'rightTd' : 'noBRight'">
-            <div v-if="tType == 1 || tType == 4" class="checkBox">
+            <div v-if="(tType == 1 || tType == 4) && courseDetail.state !=7" class="checkBox">
               <span :class="{ active: type == 2 }" @click="type = 2"
                 >阶段选择
                 <div v-show="false">
                   {{
-                    courseDetail.state == 1 
+                    courseDetail.state == 1
                       ? "阶段模式"
                       : courseDetail.state == 2
                       ? "任务模式"
                       : courseDetail.state == 3
-                      ? "极简模式" 
-                      : courseDetail.state == 4 || courseDetail.state == 5 
+                      ? "极简模式"
+                      : courseDetail.state == 4 || courseDetail.state == 5
                       ? "AI模式"
                       : "上课模式"
                   }}
@@ -244,6 +243,7 @@
                 class="courseItem"
                 v-for="(item, index) in chapInfo"
                 :key="index"
+                v-if="courseDetail.state!=7"
                 @click="goToStudyRate(index)"
                 :class="{
                   disabled: isFollow == 2 && tType == 2 && followC != index,
@@ -265,6 +265,20 @@
                 </div>
               </div>
 
+              <div
+                class="courseItem"
+                v-if="courseDetail.state==7"
+                @click="goToStudyRate('')"
+              >
+                <div class="jdAndTask">
+                  <div>进入课程</div>
+                  <div>点击进入课程</div>
+                </div>
+                <div style="font-size: 14px; font-weight: 400; color: 3681FC;opacity: 0;">
+                  0个任务
+                </div>
+              </div>
+
               <!-- <div
                 class="blue_box_one"
                 v-for="(item, index) in chapInfo"
@@ -456,7 +470,7 @@
                               </div>
                               <!-- <div v-if="item3.tool == 5">
                             <img
-                              
+
                               src="../assets/icon/thirdToolList/score.png"
                               alt
                             />
@@ -1041,6 +1055,7 @@
             <div
               class="blue_box"
               v-for="(item, index) in chapInfo"
+              v-if="courseDetail.state!=7"
               :key="index"
               @click="addUserRate(index)"
             >
@@ -1084,6 +1099,7 @@
       </div>
       <div class="cancelDiy" @click="dialogVisibleSk = false">取消</div>
     </el-dialog>
+    <selectTeachingClassDialog :courseDetail="courseDetail" :userId="userid" ref="selectTeachingClassDialogRef" @success="selectClassSuccess" @changeClassList="changeClassList"/>
   </div>
 </template>
 
@@ -1109,6 +1125,8 @@ let converter = OpenCC.Converter({
 		to:'cn'
 })
 
+import selectTeachingClassDialog from "./dialog/selectTeachingClassDialog.vue";
+
 const getFile = (url) => {
   return new Promise((resolve, reject) => {
     var credentials = {
@@ -1140,7 +1158,7 @@ const getFile = (url) => {
           resolve({ data: 1 });
         }else {
           resolve({ data: data.Body });
-          console.log(data); 
+          console.log(data);
         }          // sxuccessful response
 
       });
@@ -1165,7 +1183,8 @@ export default {
   components: {
     Heatmap,
     Group,
-    scoreZong
+    scoreZong,
+    selectTeachingClassDialog
   },
   data() {
     return {
@@ -1394,7 +1413,7 @@ export default {
               this.screenType
           );
         }
-      }else if (this.courseDetail.state == 6) {
+      } else if (this.courseDetail.state == 6) {
         if (this.classList.length) {
           this.goTo(
             "/studySutdentClass?type=" +
@@ -1436,6 +1455,48 @@ export default {
               this.screenType
           );
         }
+      }  else if (this.courseDetail.state == 7) {
+        if(this.classList.length){
+          this.goTo(
+            "/pptEasyClass?type=" +
+              this.checkStage +
+              "&courseId=" +
+              this.id +
+              "&userid=" +
+              this.userid +
+              "&oid=" +
+              this.oid +
+              "&org=" +
+              this.org +
+              "&cid=" +
+              this.classId +
+              "&tType=" +
+              this.tType +
+              "&screenType=" +
+              this.screenType +
+              "&tcid=" +
+              id
+          );
+        }else {
+          this.goTo(
+            "/pptEasyClass?type=" +
+              this.checkStage +
+              "&courseId=" +
+              this.id +
+              "&userid=" +
+              this.userid +
+              "&oid=" +
+              this.oid +
+              "&org=" +
+              this.org +
+              "&cid=" +
+              this.classId +
+              "&tType=" +
+              this.tType +
+              "&screenType=" +
+              this.screenType
+          );
+        }
       }
 
       let params = [
@@ -1453,45 +1514,51 @@ export default {
 
     },
     goToStudyOrDia(l) {
-      if (l.length > 0) {
-        this.dialogVisibleSk = true;
+      //if (l.length > 0) {
+        // this.dialogVisibleSk = true;
+        this.$refs.selectTeachingClassDialogRef.open({classList:this.classList})
+        this.inviteCodeFn(this.classList)
 				this.insertMemorandum("点击<span class='btn'>以班级授课</span>")
-      } else {
-				this.getCourseDetail1().then(_=>{
-					if(this.classList.length<=0){
-						this.$confirm("该课程尚未指定授课班级,请返回首页,使用修改功能添加授课班级。","提示",{
-							confirmButtonText: '去修改',
-        		  cancelButtonText: '取消',
-							type:"error",
-						}).then(() => {
-							if(this.courseDetail.state == 1 || this.courseDetail.state == 2){
-								window.topU.postMessage({ tools: "openNewCourseUpdate",cid:this.id }, "*");
-							}else if(this.courseDetail.state == 3){
-								window.topU.postMessage({ tools: "openCourseEUpdate",cid:this.id }, "*");
-							}else if(this.courseDetail.state == 4 || this.courseDetail.state == 5){
-								window.topU.postMessage({ tools: "openCourseAiUpdate",cid:this.id }, "*");
-              }else if(this.courseDetail.state == 6){
-								window.topU.postMessage({ tools: "openCourseAiUpdate2",cid:this.id }, "*");
-              }
-
-						})
-					}else{
-						this.dialogVisibleSk = true;
-					}
-        })
+      // } else {
+			// 	this.getCourseDetail1().then(_=>{
+			// 		if(this.classList.length<=0){
+			// 			this.$confirm("该课程尚未指定授课班级,请返回首页,使用修改功能添加授课班级。","提示",{
+			// 				confirmButtonText: '去修改',
+      //   		  cancelButtonText: '取消',
+			// 				type:"error",
+			// 			}).then(() => {
+			// 				if(this.courseDetail.state == 1 || this.courseDetail.state == 2){
+			// 					window.topU.postMessage({ tools: "openNewCourseUpdate",cid:this.id }, "*");
+			// 				}else if(this.courseDetail.state == 3){
+			// 					window.topU.postMessage({ tools: "openCourseEUpdate",cid:this.id }, "*");
+			// 				}else if(this.courseDetail.state == 4 || this.courseDetail.state == 5){
+			// 					window.topU.postMessage({ tools: "openCourseAiUpdate",cid:this.id }, "*");
+      //         }else if(this.courseDetail.state == 6){
+			// 					window.topU.postMessage({ tools: "openCourseAiUpdate2",cid:this.id }, "*");
+      //         }else if(this.courseDetail.state == 7){
+      //           window.topU.postMessage({ tools: "openCoursePptUpdate",cid:this.id }, "*");
+      //         }
+			// 			})
+			// 		}else{
+			// 			this.dialogVisibleSk = true;
+			// 		}
+      //   })
         // this.addUserRate(0);
-      }
+      //}
     },
     goToStudyRate(i) {
       this.checkStage = i;
       if (this.tType == 2) {
         this.addUserRate(i);
       } else {
-        if (this.classList.length > 0) {
-          this.dialogVisibleSk = true;
-        } else {
-          this.addUserRate(i);
-        }
+        this.$refs.selectTeachingClassDialogRef.open({classList:this.classList})
+        this.inviteCodeFn(this.classList)
+        // if (this.classList.length > 0) {
+        //   // this.dialogVisibleSk = true;
+        //   this.$refs.selectTeachingClassDialogRef.open({classList:this.classList})
+        // } else {
+        //   this.addUserRate(i);
+        // }
       }
     },
     addUserRate(i) {
@@ -1522,7 +1589,7 @@ export default {
       //     }
       //   }
       // }
-      if (this.isFollow == 2 && this.tType == 2 && this.followC != i) {
+      if (this.isFollow == 2 && this.tType == 2 && this.followC != i && this.courseDetail.state != 7) {
         return;
       }
       let params = {
@@ -1610,7 +1677,27 @@ export default {
                   "&screenType=" +
                   this.screenType
               );
-            }
+            }else if (this.courseDetail.state == 7) {
+              this.goTo(
+                "/pptEasyClass?type=" +
+                  this.checkStage +
+                  "&courseId=" +
+                  this.id +
+                  "&userid=" +
+                  this.userid +
+                  "&oid=" +
+                  this.oid +
+                  "&org=" +
+                  this.org +
+                  "&cid=" +
+                  this.classId +
+                  "&tType=" +
+                  this.tType +
+                  "&screenType=" +
+                  this.screenType
+              );
+            // this.gotoCourse(this.classId);
+          }
           } else if (this.tType == 2) {
             // this.goTo(
             //   "/studyStudent?type=" +
@@ -1707,7 +1794,27 @@ export default {
                   "&screenType=" +
                   this.screenType
               );
-            }
+            }else if (this.courseDetail.state == 7) {
+              this.goTo(
+            "/pptEasyClass?type=" +
+              this.checkStage +
+              "&courseId=" +
+              this.id +
+              "&userid=" +
+              this.userid +
+              "&oid=" +
+              this.oid +
+              "&org=" +
+              this.org +
+              "&cid=" +
+              this.classId +
+              "&tType=" +
+              this.tType +
+              "&screenType=" +
+              this.screenType
+          );
+            // this.gotoCourse(this.classId);
+          }
             // this.gotoCourse(this.classId);
           } else {
             this.goTo(
@@ -1772,7 +1879,7 @@ export default {
         }
       }
       this.brief = this.sbrief ? this.sbrief : this.MarkdownT(this.courseDetail.brief)
-      
+
       if(this.brief && !this.sbrief && (this.courseDetail.state == 6 || this.courseDetail.state == 5) && this.courseDetail.userid == this.userid){
         this.aiChatContent()
       }
@@ -1818,7 +1925,13 @@ export default {
           ic: res.data[4][i].code,
         });
       }
-      if (res.data[3].length != this.inviteCode.length) {
+
+      let _inviteCodeLength = res.data[3].reduce((pre,cur)=>{
+        this.inviteCode.map(i=>i.cid).includes(cur.id)?pre+=1:'';
+        return pre
+      },0)
+
+      if (_inviteCodeLength != res.data[3].length) {
         let classArray = [];
         let noClassArray = [];
         for (var i = 0; i < res.data[3].length; i++) {
@@ -1857,6 +1970,15 @@ export default {
           }
         }
       }
+
+      if(this.courseDetail.state == 7 && this.tType == 2){
+        this.goToStudyRate('')
+      }
+      const element = document.getElementsByClassName("pb_body")[0];
+      if (element) {
+          element.style.minHeight = 'unset'
+          // 或者:element.style.removeProperty("min-height");
+      }
       // debugger
     },
     addInviteCode() {
@@ -2414,6 +2536,48 @@ export default {
         }
       };
     },
+    selectClassSuccess(classId){
+      this.gotoCourse(classId);
+      this.$refs.selectTeachingClassDialogRef.close();
+    },
+    async changeClassList(data){
+      this.classList = JSON.parse(JSON.stringify(data))
+      let params = [{
+        cid:this.id,
+        juri:this.classList.map(i=>i.id).join(',')
+      }]
+      this.ajax.post(this.$store.state.api+"update_CourseJuriById",params).then(res=>{
+        if(res.data==1){
+          console.log("修改成功")
+        }
+      })
+
+      this.inviteCodeFn();
+    },
+    // 随机码
+    async inviteCodeFn(){
+      let _inviteCodeLength = this.classList.reduce((pre,cur)=>{this.inviteCode.map(i=>i.cid).includes(cur.id)?pre+=1:'';return pre},0)
+      if (_inviteCodeLength != this.classList.length) {
+        let classArray = [];
+        let noClassArray = [];
+        for (var i = 0; i < this.classList.length; i++) {
+          classArray.push(this.classList[i].id);
+          noClassArray.push(this.classList[i].id);
+        }
+        this.inviteCode = this.inviteCode.filter((el) => {
+          if (classArray.indexOf(el.cid) != -1) {
+            noClassArray.splice(noClassArray.indexOf(el.cid), 1);
+            return el;
+          }
+        });
+        for (var i = 0; i < noClassArray.length; i++) {
+          await this.getInviteCode(noClassArray[i]);
+        }
+        let a = this.inviteCode;
+        console.log(this.inviteCode);
+        this.addInviteCode();
+      }
+    }
   },
   created() {
     // if(this.tType == 1 || this.tType == 4){
@@ -2463,7 +2627,7 @@ export default {
 
 .returnIndexImg > img {
   width: 100%;
-	
+
 }
 
 .wheel {

+ 473 - 0
src/components/dialog/addClassDialog.vue

@@ -0,0 +1,473 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择班级"
+      :visible.sync="show"
+      :append-to-body="true"
+      width="800px"
+      height="80%"
+      class="addNewPP2"
+    >
+      <div class="check_classBox" v-loading="isLoading">
+        <div class="check_class_right">
+          <span>年级</span>
+          <div
+            class="check_class"
+            :class="{ activeX: gradeId == '' }"
+            @click="(gradeId = ''), getClass()"
+          >
+            全部年级
+          </div>
+          <el-tooltip
+            placement="top"
+            :content="item.name"
+            v-for="(item, index) in gradeList"
+            :key="index"
+          >
+            <div
+              class="check_class"
+              :class="{ activeX: gradeId == item.id }"
+              @click="(gradeId = item.id), getClass()"
+            >
+              {{ item.name }}
+            </div>
+          </el-tooltip>
+        </div>
+        <div class="check_class_left">
+          <div class="check_class_all_box">
+            <div class="check_class_left_title">班级</div>
+            <!-- <div style="display:flex;align-items:center;margin-left:auto;">
+              <el-checkbox
+                v-model="checkAll"
+                @change="handleCheckAllChange"
+                class="all_check"
+                >全选</el-checkbox
+              >
+            </div> -->
+          </div>
+          <!-- <div class="class_item" style="position:absolute; margin:0" v-if="grade2.length">
+            <el-checkbox v-model="checkAll" @change="handleCheckAllChange">全选</el-checkbox>
+          </div> -->
+          <!-- <el-checkbox-group
+            v-model="checkboxList2"
+            class="check_class_item"
+            @change="InviteChange"
+            v-if="grade2.length"
+          >
+            <div v-for="item in grade2" :key="item.id" class="class_item">
+              <el-checkbox :label="item.id">
+                {{ item.name }}
+              </el-checkbox>
+            </div>
+          </el-checkbox-group> -->
+          <div class="classItem" @click="classItemClick(item)" :class="{classActiveItem:checkboxList2.map(i=>i.id).includes(item.id)}" v-for="item in grade2" :key="item.id">
+            <div class="ci_left">
+              <div>{{ item.name }}</div>
+              <span v-if="item.studentNum>=0">{{ item.studentNum }}名学生</span>
+            </div>
+            <div class="ci_right">
+
+              <svg v-show="checkboxList2.map(i=>i.id).includes(item.id)" t="1756864121172" class="icon" viewBox="0 0 1098 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4441" width="200" height="200"><path d="M476.808045 0.000043C213.401753 0.106685-0.031993 213.68973 0 477.074693S213.551052 953.98938 476.94668 954.021373s476.957344-213.412417 477.085315-476.808045A477.010665 477.010665 0 0 0 476.808045 0.000043z m273.761252 353.369671L441.861388 661.853674a43.1901 43.1901 0 0 1-62.023117 0L202.214984 484.251715a43.864079 43.864079 0 1 1 62.033781-62.033782l147.21959 147.21959 277.89897-276.86454a43.861946 43.861946 0 1 1 62.023117 62.033781z m0 0" p-id="4442" fill="#4CAF51"></path></svg>
+            </div>
+          </div>
+          <div v-if="!grade2.length">暂无数据</div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <div class="b_bottom">
+					<div @click="close()">取消</div>
+          <div class="b_b_submit" @click="submit()">确定</div>
+				</div>
+        <!-- <el-button @click="close()">取 消</el-button>
+        <el-button type="primary" @click="submit()">确定</el-button> -->
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { myMixin } from "@/mixins/mixin.js";
+  export default {
+    mixins: [myMixin],
+    props: {
+      courseDetail: {
+        type: Object,
+        default: () => {}
+      }
+    },
+    data(){
+      return {
+        show:false,
+        gradeId:"",
+        gradeList:[],
+        checkAll:false,
+        checkboxList2:[],
+        grade2:[],
+        grade:[],
+        oid:this.$route.query.oid,
+        classJuri:[],
+        classSearch:"",
+        isLoading:false,
+      }
+    },
+    methods:{
+      open(data){
+        let _classList = data.classList?JSON.parse(JSON.stringify(data.classList)):[];
+        this.checkboxList2 = _classList;
+        this.getClass();
+        this.selectGrage();
+        this.show = true;
+
+      },
+      close(){
+        this.show = false;
+      },
+      init(){
+        this.gradeId = "";
+        this.classSearch = "";
+      },
+      getClass(){
+        let params = {
+          oid: this.oid,
+          gid: this.gradeId,
+          cn: this.classSearch
+        };
+        this.isLoading = true;
+        this.ajax
+        .get(this.$store.state.api + "selectClassBySchoolSearch2", params)
+        .then(res => {
+          this.isLoading = false;
+          if (!this.grade.length) {
+            this.grade = res.data[0];
+          }
+          this.grade2 = res.data[0];
+          this.classJuri = res.data[0];
+          let _check = [];
+          let _check2 = [];
+          for (var i = 0; i < this.grade2.length; i++) {
+            var gid = this.grade2[i].id;
+            _check.push(gid);
+          }
+          for (var i = 0; i < this.checkboxList2.length; i++) {
+            var _id = this.checkboxList2[i];
+            if (_check.indexOf(_id) !== -1) {
+              _check2.push(_id);
+            }
+          }
+          this.checkAll = _check2.length === _check.length;
+        })
+        .catch(err => {
+          this.isLoading = false;
+          console.error(err);
+        });
+      },
+      selectGrage() {
+      let params = {
+        oid: this.oid
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectGrageBySchool", params)
+        .then(res => {
+          this.gradeList = res.data[0];
+        })
+        .catch(err => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+      submit() {
+        if (
+          this.courseDetail.userid == this.$route.query.userid &&
+          this.checkboxList2.length &&
+          this.$route.query.org == '16ace517-b5c7-4168-a9bb-a9e0035df840' &&
+          this.courseDetail.state == '7'
+        ) {
+
+          // 获取endTime为现在
+          let endDate = new Date();
+          let endTime = endDate.toLocaleString("zh-CN", {
+            hour12: false,
+            timeZone: "Asia/Shanghai"
+          }).replace(/\//g, "-");
+
+          // 随机20~50分钟
+          let randomMinutes = Math.floor(Math.random() * 31) + 20;
+          let startDate = new Date(endDate.getTime() - randomMinutes * 60 * 1000);
+          let startTime = startDate.toLocaleString("zh-CN", {
+            hour12: false,
+            timeZone: "Asia/Shanghai"
+          }).replace(/\//g, "-");
+
+          let courseTime = randomMinutes;
+          this.syncClassData2({
+            courseId: this.courseDetail.courseId,
+            title: this.courseDetail.title,
+            courseGrade: this.checkboxList2[0].id,
+            courseTime: courseTime,
+            startTime: startTime,
+            endTime: endTime,
+          });
+
+          let params = [
+            {
+              uid: this.courseDetail.userid,
+              cid: this.courseDetail.courseId,
+              type: "5",
+              time: randomMinutes * 60,
+            },
+          ];
+          this.ajax
+          .post(this.$store.state.api + "addOperationTimeT2", params)
+          .then((res) => {})
+          .catch((err) => {
+            console.error(err);
+          });
+        }
+        let data = JSON.parse(JSON.stringify(this.checkboxList2));
+
+        this.$emit("success", data);
+      },
+      classItemClick(item){
+        if(this.checkboxList2.map(i=>i.id).includes(item.id)){
+          this.checkboxList2 = this.checkboxList2.filter(i => i.id != item.id);
+        }else{
+          this.checkboxList2.push(item)
+        }
+      }
+    }
+
+  }
+</script>
+
+<style  scoped>
+.addNewPP2 >>> .el-dialog__body {
+  padding: 5px 0;
+}
+
+.addNewPP2 >>> .el-dialog {
+  margin-top: 5vh !important;
+  border-radius: 10px !important;
+}
+
+.check_classBox {
+  height: 400px;
+  display: flex;
+  border-top: 1.5px solid #e7ebf1;
+  border-bottom: 1.5px solid #e7ebf1;
+}
+
+.check_class_right {
+  width: 200px;
+  border-right: 1px solid #e7ebf1;
+  display: flex;
+  align-items: center;
+  flex-direction: column;
+  height: 100%;
+  overflow: auto;
+  padding: 15px 0;
+  box-sizing: border-box;
+  padding-top: 40px;
+  position: relative;
+}
+
+.check_class_right>span{
+  font-size: 14px;
+  text-align: left;
+  position: absolute;
+  left: 10px;
+  top: 10px;
+  font-weight: 700;
+}
+
+.check_class {
+  width: 85%;
+  border-radius: 5px;
+  height: 50px;
+  min-height: 30px;
+  padding: 0 20px;
+  box-sizing: border-box;
+  cursor: pointer;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  background: #fff;
+  border: solid 1px #E2E9EE;
+}
+
+.check_class.activeX {
+  background: #E8F5E8;
+  color: #4CAF51;
+  font-weight: 700;
+  border-color: #4CAF51;
+}
+
+.check_class + .check_class {
+  margin-top: 15px;
+}
+
+.check_class_left {
+  background: #fafafa;
+  width: calc(100% - 130px);
+  padding: 15px;
+  box-sizing: border-box;
+  overflow: auto;
+}
+
+.check_class_all_box {
+  display: flex;
+  margin-bottom: 10px;
+}
+
+.all_check {
+  display: flex;
+  align-items: center;
+  padding: 2px 0 0;
+  margin-left: 10px;
+}
+
+.all_check >>> .el-checkbox__label {
+  line-height: 18px;
+}
+
+.check_class_left_title {
+  font-size: 14px;
+  font-weight: 700;
+}
+
+.check_class_item {
+  display: flex;
+  flex-wrap: wrap;
+  height: calc(100% - 45px);
+  overflow: auto;
+  justify-content: flex-start;
+  align-items: flex-start;
+  align-content: flex-start;
+}
+
+.class_item:first-child {
+  /* margin: 0 15px 15px 67px; */
+}
+.class_item {
+  margin: 0 15px 15px 0;
+}
+
+.class_item:hover >>> .el-checkbox__label {
+  color: #409eff;
+}
+
+.class_item >>> .el-checkbox__label {
+  color: #0e1e33;
+}
+
+.class_item:hover >>> .el-checkbox__inner {
+  border-color: #409eff;
+}
+
+.class_item >>> .el-checkbox,
+.class_item >>> .el-checkbox__input {
+  display: flex;
+  align-items: center;
+}
+
+.classItem{
+  width: 100%;
+  height: 70px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background: #fff;
+  box-sizing: border-box;
+  border: solid 1px #E1E8ED;
+  border-radius: 10px;
+  margin-bottom: 15px;
+  padding-left: 30px;
+  position: relative;
+}
+
+.classItem::after{
+  content: "";
+  height: 100%;
+  width: 8px;
+  background: #E1E8ED;
+  position: absolute;
+  left: 0;
+  top: 0;
+  border-radius: 10px 0 0 10px;
+  cursor: pointer;
+}
+
+.ci_left{
+  width: calc(100% - 70px);
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.ci_left>div{
+  color: #000;
+  font-size: 16px;
+  margin-bottom: 4px;
+  font-weight: 700;
+}
+
+.ci_left>span{
+  font-size: 14px;
+  color: #8F8F8F;
+}
+
+.ci_right{
+  width: 70px;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+}
+
+.ci_right>svg{
+  width: 20px;
+  height: 20px;
+}
+
+.classActiveItem{
+  border: solid 1px #4CAF51;
+}
+
+.classActiveItem::after{
+  background: #4CAF51;
+}
+
+.b_bottom {
+	width: 100%;
+	height: 40px;
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+	box-sizing: border-box;
+	padding: 0 20px;
+}
+
+.b_bottom>div{
+  padding: 10px 25px;
+  background: #fff;
+  color: #000;
+  border-radius: 4px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: solid 1px #EEEEEE;
+  margin-left: 15px;
+  cursor: pointer;
+}
+
+.b_bottom>.b_b_submit{
+  background: #1A1A1A;
+  color: #D4D4D4;
+  border-color: #1A1A1A;
+}
+
+</style>

+ 294 - 0
src/components/dialog/selectTeachingClassDialog.vue

@@ -0,0 +1,294 @@
+<template>
+	<div>
+		<el-dialog
+			:center="true"
+			:visible.sync="show"
+			:close-on-click-modal="true"
+			:modal="true"
+			width="auto"
+			height="auto"
+			:append-to-body="true"
+			class="dialog"
+		>
+			<div class="box">
+				<div class="b_head">
+					<span>选择授课班级</span>
+					<svg
+						@click="close()"
+						t="1748587270371"
+						class="icon"
+						viewBox="0 0 1024 1024"
+						version="1.1"
+						xmlns="http://www.w3.org/2000/svg"
+						p-id="5023"
+						width="200"
+						height="200"
+					>
+						<path
+							d="M0 0h1024v1024H0z"
+							fill="#FF0033"
+							fill-opacity="0"
+							p-id="5024"
+						></path>
+						<path
+							d="M240.448 168l2.346667 2.154667 289.92 289.941333 279.253333-279.253333a42.666667 42.666667 0 0 1 62.506667 58.026666l-2.133334 2.346667-279.296 279.210667 279.274667 279.253333a42.666667 42.666667 0 0 1-58.005333 62.528l-2.346667-2.176-279.253333-279.253333-289.92 289.962666a42.666667 42.666667 0 0 1-62.506667-58.005333l2.154667-2.346667 289.941333-289.962666-289.92-289.92a42.666667 42.666667 0 0 1 57.984-62.506667z"
+							fill="#fff"
+							p-id="5025"
+						></path>
+					</svg>
+				</div>
+				<div class="b_main" v-loading="loading">
+          <template v-for="item in classList">
+            <div class="b_m_classItem" :class="{'b_m_classItem_active':selectId == item.id}" :key="item.id" v-if="item.name" @click="selectId == item.id ? selectId = '' : selectId = item.id" >
+            <div>{{ item.name }}</div>
+            <span v-if="item.studentNum>=0">{{ item.studentNum }}名学生</span>
+          </div>
+          </template>
+
+          <div class="b_m_classItem" @click="editClass" v-if="courseDetail.userid == userId">
+              <div>
+                <span>+</span>
+                <svg t="1756867649445" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10274" width="200" height="200"><path d="M417.664 921.6l317.184-824.32h-63.616L353.152 921.6z" fill="#999999" p-id="10275"></path></svg>
+                <span>-</span>
+              </div>
+            <div>添加/修改班级</div>
+          </div>
+
+          <div class="b_m_noClassMsg" v-if="classList.length<=0 && courseDetail.userid != userId">
+            <span>创建人暂未添加班级</span>
+          </div>
+				</div>
+				<div class="b_bottom">
+					<div @click="close()">取消</div>
+          <div class="b_b_submit" @click="submit()">{{selectId ? '确定' : '直接进入'}}</div>
+				</div>
+			</div>
+		</el-dialog>
+    <addClassDialog ref="addClassDialogRef" @success="addClassSuccess" :courseDetail="courseDetail"/>
+	</div>
+</template>
+
+<script>
+import addClassDialog from './addClassDialog.vue';
+export default {
+  props:{
+    courseDetail:{
+      type:Object,
+      default:()=>{return {}}
+    },
+    userId:{
+      type:String,
+      default:""
+    }
+  },
+  components:{
+    addClassDialog
+  },
+	data() {
+		return {
+			loading: false,
+			show: false,
+			data: null,
+      classList:[],
+      selectId:"",
+		};
+	},
+	computed: {},
+	methods: {
+		open(data) {
+			this.data = JSON.parse(JSON.stringify(data));
+      this.classList = this.data.classList;
+			this.loading = false;
+			this.show = true;
+		},
+		close() {
+			this.show = false;
+			this.init();
+		},
+		init() {
+			this.data = null;
+      this.classList = [];
+      this.selectId = "";
+			this.loading = false;
+		},
+    submit(){
+      // console.log(this.selectId)
+      this.$emit("success",this.selectId)
+    },
+    editClass(){
+      this.$refs.addClassDialogRef.open({classList:this.classList});
+    },
+    addClassSuccess(data){
+      this.classList = data;
+      this.$emit("changeClassList",this.classList);
+      this.$refs.addClassDialogRef.close();
+
+    },
+	},
+};
+</script>
+
+<style scoped>
+.dialog >>> .el-dialog {
+	width: 900px !important;
+	border-radius: 8px;
+	padding: 0;
+	background-color: #fff;
+	overflow: hidden;
+}
+
+.dialog >>> .el-dialog__body {
+	width: 900px !important;
+	height: auto;
+	flex-shrink: 0;
+	padding: 0;
+	box-sizing: border-box;
+	overflow: auto;
+}
+
+.dialog >>> .el-dialog__header {
+	display: none !important;
+}
+
+.box {
+	width: 900px;
+	height: auto;
+	background: #fafafa;
+	border-radius: 15px;
+	box-shadow: 0px 6px 30px 5px rgba(0, 0, 0, 0.05),
+		0px 16px 24px 2px rgba(0, 0, 0, 0.04), 0px 8px 10px -5px rgba(0, 0, 0, 0.08);
+}
+
+.b_head {
+	width: 100%;
+	height: 50px;
+	/* border-radius: 15px 15px 0 0; */
+	background: #1A1A1A;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	box-sizing: border-box;
+	padding: 0 20px;
+  color: #fff;
+}
+
+.b_head > span {
+	font-size: 18px;
+	font-weight: bold;
+	color: #fff;
+}
+
+.b_head > img {
+	width: 20px;
+	height: 20px;
+	cursor: pointer;
+}
+
+.b_head > svg {
+	width: 20px;
+	height: 20px;
+	cursor: pointer;
+}
+
+.b_main {
+	width: 100%;
+	height: 400px;
+	background: #fafafa;
+	padding: 20px 20px 20px 20px;
+	box-sizing: border-box;
+  overflow: auto;
+}
+
+.b_bottom {
+	width: 100%;
+	height: 70px;
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+	box-sizing: border-box;
+	padding: 0 20px;
+}
+
+.b_bottom>div{
+  padding: 10px 25px;
+  background: #fff;
+  color: #000;
+  border-radius: 4px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: solid 1px #EEEEEE;
+  margin-left: 15px;
+  cursor: pointer;
+  font-size: 16px;
+}
+
+.b_bottom>.b_b_submit{
+  background: #1A1A1A;
+  color: #D4D4D4;
+  border-color: #1A1A1A;
+}
+
+.b_m_classItem{
+  width: 32%;
+  height: 85px;
+  float: left;
+  margin-bottom: 20px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+  background: #fff;
+  box-shadow: 0px 6px 30px 5px rgba(0, 0, 0, 0.05),
+		0px 16px 24px 2px rgba(0, 0, 0, 0.04), 0px 8px 10px -5px rgba(0, 0, 0, 0.08);
+  border-radius: 12px;
+  cursor: pointer;
+  transition: .2s;
+}
+
+.b_m_classItem>div{
+  color: #5F5F5F;
+  font-size: 16px;
+  margin: 4px 0;
+  display: flex;
+  flex-wrap: wrap;
+  align-content: center;
+}
+
+.b_m_classItem>div>span{
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 25px;
+  height: 25px;
+  border-radius: 4px;
+  border: solid 1px #B0B0B0;
+}
+
+.b_m_classItem>div>svg{
+  width: 20px;
+  height: 25px;
+  margin: 0 5px;
+}
+
+.b_m_classItem>span{
+  color: #A3A3A3;
+  font-size: 14px;
+}
+
+.b_main > div:nth-child(3n-1) {
+  margin: 0 2%;
+}
+
+.b_m_classItem_active{
+  box-shadow: 4px 4px 4px 0px rgba(138, 238, 138, 0.555);
+}
+
+.b_m_noClassMsg{
+  width:100%;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+</style>

+ 1 - 1
src/components/easy/studyStudent.vue

@@ -2854,7 +2854,7 @@ export default {
       isAnswer: false,
       timer: null,
       opertimer: null,
-      showType: 0,
+      showType: '',
       fileType: 0,
       showPDF: false,
       noteName: "",

+ 210 - 39
src/components/easy2/studyStudent.vue

@@ -106,7 +106,7 @@
             style="padding: 0 0 8px 0"
           >
             <div>
-              <span>随机码:{{ inviteCode }}</span>
+              <span>识别码:{{ Code2 ? Code2 + inviteCode : inviteCode }}</span>
             </div>
           </div>
         </div>
@@ -506,6 +506,7 @@
                   flex-direction: column;
                   position: relative;
                 "
+                class="renderedFor"
               >
                 <div
                   style="
@@ -559,12 +560,12 @@
                       style="height: 650px; width: calc(100% - 50px)"
                     >
                       <video-player
-                        class="video-player vjs-custom-skin"
+                        class="video-player vjs-custom-skin notop"
                         :class="contentDialog == false ? 'isAllWidth' : ''"
                         :playsinline="true"
                         :options="playerO[taskCount]"
                         @play="onPlayerPlay($event)"
-                        style="width: 100%; height: 100%; margin: 0 0 0 30px"
+                        style="width: 100%; height: 650px; margin: 0 0 0 30px"
                       ></video-player>
                     </div>
                   </div>
@@ -725,12 +726,12 @@
                               <span v-if="vitem.text">{{ vitem.text }}-</span
                               >{{ vitem.name }}
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
 
                           <div class="navListItem" v-if="vitem.type == 6">
@@ -790,12 +791,12 @@
                                 alt
                               />
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 12">
                             <div class="navText" @click="downloadFile2(vitem)">
@@ -811,12 +812,12 @@
                                 alt
                               />
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 13">
                             <div
@@ -826,12 +827,12 @@
                             >
                               {{ vitem.name }}
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 16">
                             <div
@@ -851,6 +852,24 @@
                               />
                             </div>
                           </div>
+                          <div class="navListItem" v-if="vitem.type == 17">
+                            <div
+                              class="navText"
+                              @click="checkHtml(vitem, vindex)"
+                              :class="isClickNav == vindex ? 'isClickNav' : ''"
+                            >
+                              {{ vitem.name }}
+                            </div>
+                            <div
+                              class="downIcon"
+                              @click="checkFileFull1(vitem.type, vitem)"
+                            >
+                              <img
+                                src="../../assets/icon/newIcon/allScreen.png"
+                                alt
+                              />
+                            </div>
+                          </div>
                         </div>
                         <div
                           class="fileC_box"
@@ -867,7 +886,7 @@
                                 <span v-if="vitem.text">{{ vitem.text }}-</span
                                 >{{ vitem.name }}
                               </div>
-                              <div
+                              <!-- <div
                                 class="downIcon"
                                 @click="downloadFile2(vitem)"
                               >
@@ -875,7 +894,7 @@
                                   src="../../assets/icon/newIcon/down.png"
                                   alt
                                 />
-                              </div>
+                              </div> -->
                             </div>
                           </div>
                         </div>
@@ -1567,7 +1586,7 @@
                       </div>
                     </div>
                     <div
-                      class="tooldetail"
+                      class="tooldetail renderedFor"
                       v-if="tool.toolDetail != ''"
                       :class="{
                         isUpdateToolDetailClass: toolDetailIndex == toolIndex
@@ -5177,7 +5196,7 @@
                       <div
                         v-for="(s, sIndex) in noWorksS[toolIndex]"
                         :key="sIndex"
-                        class="noWorksName"
+                        class="noWorksName2"
                         @click="teacherWorkSubmit(72, toolIndex, taskCount, s)"
                       >
                         <el-tooltip
@@ -6205,6 +6224,7 @@
                               word-break: break-word;
                               cursor: pointer;
                             "
+                            class="renderedFor"
                           >
                             {{ index + 1 + "、"  }} <span v-html="renderedFormula(item.teststitle)"></span>
                           </div>
@@ -13025,21 +13045,21 @@
             :key="index1"
           >
             <div class="a_add_head">
-              <div style="display: flex;align-items: center;">
+              <div style="display: flex;">
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (单选题)
                 </div>
                 <div
                   v-if="testJson.testJson[index1].type == '2'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (多选题)
                 </div>
-                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
+                <div class="renderedFor">题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -13487,7 +13507,9 @@
               @change="updateLookOpen"
             ></el-switch>
           </div>
-          <div class="switch_box" v-if="courseDetail.userid == userid">
+          <div class="switch_box" v-if="(courseDetail.userid == userid ||
+                (courseDetail.course_teacher &&
+                  courseDetail.course_teacher.indexOf(userid) != -1)) && !splitScreenData.isOpen">
             <span>开启跟随模式</span>
             <el-switch
               v-model="IsFollow"
@@ -16383,6 +16405,9 @@ export default {
   },
   data() {
     return {
+      // 学校或者组织随机码
+      Code2:'',
+      startTime: "",
       // 是否允许学生查看内容资料 2不可以 1可以
       IsStulook:false,
       homeWorkLoading:false,
@@ -16671,7 +16696,7 @@ export default {
       timer: null,
       timer2: null,
       opertimer: null,
-      showType: 0,
+      showType: '',
       fileType: 0,
       showPDF: false,
       noteName: "",
@@ -16799,7 +16824,14 @@ export default {
       },
       confirmOpenDig:false,
       confirmOpenDigData:'',
-      diffKey:"1"
+      diffKey:"1",
+      getCourseGroupLoading: false,
+      selectSWorksLoading:false,
+      selectStudentLoading:false,
+      selectSLookLoading:false,
+      getPickLoading:false,
+      selectPzLoading:false,
+      getSplitScreenDataLoading:false,
     };
   },
   watch:{
@@ -16821,11 +16853,11 @@ export default {
     },
     worksStudent: {
       handler(newVal, oldVal) {
-          const sum1 = newVal.reduce((total, subArr) => total + subArr.length, 0);
-          const sum2 = oldVal.reduce((total, subArr) => total + subArr.length, 0);
+          // const sum1 = newVal.reduce((total, subArr) => total + subArr.length, 0);
+          // const sum2 = oldVal.reduce((total, subArr) => total + subArr.length, 0);
           // console.log('worksStudent',sum1,sum2);
           
-          if(sum1 != sum2){
+          if(JSON.stringify(newVal) !=  JSON.stringify(oldVal)){
               this.AIloading = [];
               this.loopLoading = [];
 
@@ -16845,6 +16877,21 @@ export default {
     }
   },
   methods: {
+    // 获取学校或组织随机码
+    getCode2(){
+      let params = {
+        oid: this.oid,
+        org: this.org
+      };
+      this.ajax
+        .get(this.$store.state.api + "getCode2", params)
+        .then(res => {
+            this.Code2 = res.data[0][0].code2
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
     getAIJ() {
       this.ajax.get(this.$store.state.api + "getAIJ", "").then(res => {
         let oid = res.data[0];
@@ -17776,6 +17823,8 @@ export default {
         }
       }
 
+      console.log('6666');
+
       this.navList[i].task[j].tool[k].isTool = !this.navList[i].task[j].tool[k]
         .isTool;
       var a = document.scrollingElement;
@@ -17837,6 +17886,12 @@ export default {
           );
         }
       }
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) &&
+          this.IsFollow) {
+        this.setCTask();
+      }
     },
     addTools2(i) {
       if (i == 4) {
@@ -18991,6 +19046,8 @@ export default {
         });
     },
     selectStudent() {
+      if (this.selectStudentLoading) return
+      this.selectStudentLoading = true
       //学生查看自己作业
       let params = {
         uid: this.userid,
@@ -19312,8 +19369,12 @@ export default {
               }
             }
           }
+          this.selectStudentLoading = false
+          
         })
         .catch(err => {
+          this.selectStudentLoading = false
+
           console.error(err);
         });
     },
@@ -19752,6 +19813,8 @@ export default {
       return lang;
     },
     selectSWorks(gindex) {
+      if (this.selectSWorksLoading) return
+      this.selectSWorksLoading = true
       //教师查看全部作业
       let params = {
         cid: this.id,
@@ -19958,6 +20021,10 @@ export default {
                   }
                 } else if (data.type == 8 && a[i].tool[0] == 45) {
                   var checkL = JSON.parse(data.content)[0].anwer;
+                  if(a[i].testJson.testCount != JSON.parse(data.content)[0].testJson.testCount){
+                    continue
+                  }
+                  console.log('选择题')
                   for (var z = 0; z < checkL.length; z++) {
                     if (!this.checkJson[i][z]) {
                       this.checkJson[i].push({
@@ -20870,8 +20937,12 @@ export default {
               }, 0);
             });
           }
+          this.selectSWorksLoading = false
+
         })
         .catch(err => {
+          this.selectSWorksLoading = false
+
           console.error(err);
         });
     },
@@ -21630,7 +21701,10 @@ export default {
       this.getHomeWork();
       this.getCourseDetail(2);
       this.$forceUpdate();
-      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) &&
+          this.IsFollow) {
         this.setCTask();
       }
     },
@@ -21761,7 +21835,9 @@ export default {
           }</span>`
         );
       }
-      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
         this.setCTask();
       }
     },
@@ -21887,8 +21963,11 @@ export default {
       this.ajax
         .get(this.$store.state.api + "selectCourseDetail3", params)
         .then(res => {
-          this.addCourseState(1, JSON.parse(res.data[0][0].chapters));
-
+          if ((this.courseDetail.userid == this.userid ||
+              (this.courseDetail.course_teacher && 
+              this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
+            this.addCourseState(1, JSON.parse(res.data[0][0].chapters));
+          }
           if (type != 2) {
             loading.close();
             if (
@@ -22087,6 +22166,9 @@ export default {
                 } else if (_chapterData[this.taskCount][0].type == 16) {
                   this.showType = 16;
                   this.pptImgUrl1 = _url;
+                } else if (_chapterData[this.taskCount][0].type == 17) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -22256,6 +22338,9 @@ export default {
                 } else if (_chapterData[this.taskCount][0].type == 16) {
                   this.showType = 16;
                   this.pptImgUrl1 = _url;
+                } else if (_chapterData[this.taskCount][0].type == 17) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -22365,7 +22450,7 @@ export default {
             if (this.courseDetail.userid == this.userid) {
             
               // 开局关闭学生查看内容
-              this.StulookMode(false)
+              this.StulookMode(true)
               // 开局打开跟随模式
               this.followingMode(true)
             }
@@ -22433,6 +22518,11 @@ export default {
           }
           _this.$nextTick(function() {
             setTimeout(() => {
+              const element = document.getElementsByClassName("pb_body")[0];
+              if (element) {
+                  element.style.minHeight = 'unset'
+                  // 或者:element.style.removeProperty("min-height");
+              }
               // var a =
               //   document.getElementsByClassName("box_course")[0].offsetHeight;
               // document.getElementsByClassName("vedioList")[0].style.height =
@@ -22456,6 +22546,8 @@ export default {
         });
     },
     getCourseGroup(gindex) {
+      if(this.getCourseGroupLoading) return
+      this.getCourseGroupLoading = true
       let params = {
         cid: this.id,
         classid: this.tcid ? this.tcid : "1"
@@ -22505,8 +22597,10 @@ export default {
             this.selectSWorks(gindex);
             this.isGroup = false;
           }
+          this.getCourseGroupLoading = false
         })
         .catch(err => {
+          this.getCourseGroupLoading = false
           // this.$message.error("网络不佳");
           console.error(err);
         });
@@ -22678,6 +22772,8 @@ export default {
       this.selectPz();
     },
     selectPz() {
+      if(this.selectPzLoading) return
+      this.selectPzLoading = true
       let params = {
         cid: this.id,
         s: this.courseType,
@@ -22700,8 +22796,12 @@ export default {
               }
             }
           }
+          this.selectPzLoading = false
+
         })
         .catch(err => {
+          this.selectPzLoading = false
+
           console.error(err);
         });
     },
@@ -22855,6 +22955,8 @@ export default {
         });
     },
     selectSLook() {
+      if(this.selectSLookLoading) return
+      this.selectSLookLoading = true
       let params = {
         cid: this.id
       };
@@ -22888,8 +22990,12 @@ export default {
               this.getCourseDetail(2);
             }
           }
+          this.selectSLookLoading = false
+
         })
         .catch(err => {
+          this.selectSLookLoading = false
+
           console.error(err);
         });
     },
@@ -23193,6 +23299,8 @@ export default {
       );
     },
     checkHtml(f, i){
+      console.log('checkHtml',f, i);
+      
       this.showType = 16;
       this.pptImgUrl1 = f.url;
       this.isClickNav = i;
@@ -24233,6 +24341,9 @@ export default {
       );
     },
     teacherWorkSubmit(t, i, index, s) {
+      console.log('t',t);
+      if(t == 72) return
+      
       this.sStudent = s;
       this.toolindex = i;
       this.sTool = t;
@@ -25735,6 +25846,8 @@ export default {
         });
     },
     getPick() {
+      if(this.getPickLoading) return
+      this.getPickLoading = true
       let params = {
         cid: this.id
       };
@@ -25772,8 +25885,10 @@ export default {
               })
               .catch(() => {});
           }
+          this.getPickLoading = false
         })
         .catch(err => {
+          this.getPickLoading = false
           this.$message.error("网络不佳");
           console.error(err);
         });
@@ -25970,6 +26085,8 @@ export default {
     getSplitScreenData() {
       // return;
       // if (this.tType != 1) return;
+      if(this.getSplitScreenDataLoading) return
+      this.getSplitScreenDataLoading = true
       let params = {
         cid: this.id
       };
@@ -26037,8 +26154,12 @@ export default {
                 .catch(() => {});
             }
           }
+          this.getSplitScreenDataLoading = false
+          
         })
         .catch(e => {
+          this.getSplitScreenDataLoading = false
+
           console.log("获取分屏数出错:", e);
         });
     },
@@ -26308,6 +26429,22 @@ export default {
     clearInterval(this.opertimer);
     this.opertimer = null;
     this.updateSplitScreenData(1);
+    if(this.courseDetail.userid == this.userid && this.org == '16ace517-b5c7-4168-a9bb-a9e0035df840'){
+      let endTime = new Date().toLocaleString("zh-CN", { 
+          hour12: false, 
+          timeZone: "Asia/Shanghai" 
+        }).replace(/\//g, "-")
+      let courseTime = Math.floor((new Date(endTime) - new Date(this.startTime)) / (1000 * 60))
+      this.syncClassData({
+        courseId: this.id,
+        title: this.courseDetail.title,
+        courseGrade: this.tcid2 ? this.tcid2 : '',
+        courseTime: courseTime,
+        startTime: this.startTime,
+        endTime: endTime,
+      })
+      console.log('同步数据')
+    }
   },
   computed: {
     renderedFormula2() {
@@ -26519,7 +26656,11 @@ export default {
     
   },
   mounted() {
-
+    this.setoTime("1");
+    this.startTime = new Date().toLocaleString("zh-CN", { 
+      hour12: false, 
+      timeZone: "Asia/Shanghai" 
+    }).replace(/\//g, "-")
     this.updateSplitScreenData(2);
     this.splitScreenData.myUid = uuidv4();
     document.body.addEventListener("click", e => {
@@ -26540,7 +26681,7 @@ export default {
       console.log(error)
     }
 
-
+    this.getCode2()
     this.setOperationTime();
     this.selectEva();
     this.getCourseDetail(10);
@@ -26569,15 +26710,15 @@ export default {
           a - 40 + "px";
       }
     });
-    let _this = this;
-    setTimeout(() => {
+    // let _this = this;
+    // setTimeout(() => {
       // _this.vedioTime = [];
       // for (var i = 0; i < _this.vedio[_this.taskCount].length; i++) {
       //   _this.vedioTime[i] = document.getElementsByClassName(
       //     "vjs-duration-display"
       //   )[i].textContent;
       // }
-    }, 1000);
+    // }, 1000);
   }
 };
 </script>
@@ -28361,6 +28502,31 @@ export default {
   white-space: nowrap;
 }
 
+.noWorksName2 {
+  background: #fff;
+  color: #0061ff;
+  width: 90px;
+  height: 25px;
+  text-align: center;
+  line-height: 25px;
+  border-radius: 4px;
+  margin: 10px 15px 10px 0;
+  white-space: nowrap;
+  overflow: hidden;
+  padding: 5px;
+  text-overflow: ellipsis;
+  cursor: pointer;
+  border: 1px solid #0061ff;
+}
+
+.noWorksName2 > span {
+  max-width: 100%;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
 .isWorksName2 {
   width: 100px;
   height: 40px;
@@ -31081,18 +31247,23 @@ div::-webkit-scrollbar {
   overflow: hidden;
   text-overflow: ellipsis;
 }
-.pb_content >>> .katex {
-  font-size: 16px;
+
+.renderedFor >>> .katex {
+  font-size: 18px;
   width: 100%;
   white-space: normal;
+  font-family: '黑体' !important;
 }
-.pb_content >>> .katex .base{
+.renderedFor >>> .katex .base{
   display: inline !important;
   display: contents !important;
 }
 
-.pb_content >>> .katex .base .cjk_fallback{
+.renderedFor>>> .katex .base .cjk_fallback{
     white-space: normal !important;
     display: inline !important;
 }
+.notop >>> .vjs-fluid{
+  padding-top: 0 !important;
+}
 </style>

+ 239 - 44
src/components/easy3/studyStudent.vue

@@ -103,7 +103,8 @@
             style="padding: 0 0 8px 0"
           >
             <div>
-              <span>随机码:{{ inviteCode }}</span>
+              <span>识别码:{{ Code2 ? Code2 + inviteCode : inviteCode }}</span>
+              <!-- <span>识别码:{{ inviteCode }}</span> -->
             </div>
           </div>
         </div>
@@ -227,6 +228,7 @@
                       <div v-if="t.tool == 62">交互视频</div>
                       <div v-if="t.tool == 71">AI智能体</div>
                       <div v-if="t.tool == 72">应用中心</div>
+                      <div v-if="t.tool == 73">PPT</div>
                     </div>
                   </div>
                 </div>
@@ -521,6 +523,7 @@
                   flex-direction: column;
                   position: relative;
                 "
+                class="renderedFor"
               >
                 <div
                   style="
@@ -568,12 +571,12 @@
                       style="height: 650px; width: calc(100% - 50px)"
                     >
                       <video-player
-                        class="video-player vjs-custom-skin"
+                        class="video-player vjs-custom-skin notop"
                         :class="contentDialog == false ? 'isAllWidth' : ''"
                         :playsinline="true"
                         :options="playerO[0]"
                         @play="onPlayerPlay($event)"
-                        style="width: 100%; height: 100%; margin: 0 0 0 30px"
+                        style="width: 100%; height: 650px; margin: 0 0 0 30px"
                       ></video-player>
                     </div>
                   </div>
@@ -730,12 +733,12 @@
                               <span v-if="vitem.text">{{ vitem.text }}-</span
                               >{{ vitem.name }}
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 6">
                             <div
@@ -794,12 +797,12 @@
                                 alt
                               />
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 12">
                             <div class="navText" @click="downloadFile2(vitem)">
@@ -815,12 +818,12 @@
                                 alt
                               />
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 13">
                             <div
@@ -830,12 +833,12 @@
                             >
                               {{ vitem.name }}
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 16">
                             <div
@@ -855,6 +858,24 @@
                               />
                             </div>
                           </div>
+                          <div class="navListItem" v-if="vitem.type == 17">
+                            <div
+                              class="navText"
+                              @click="checkHtml(vitem, vindex)"
+                              :class="isClickNav == vindex ? 'isClickNav' : ''"
+                            >
+                              {{ vitem.name }}
+                            </div>
+                            <div
+                              class="downIcon"
+                              @click="checkFileFull1(vitem.type, vitem)"
+                            >
+                              <img
+                                src="../../assets/icon/newIcon/allScreen.png"
+                                alt
+                              />
+                            </div>
+                          </div>
                         </div>
                         <div class="fileC_box" v-if="fileC[0].length > 0">
                           <div class="fileC_title">以下文件不支持预览</div>
@@ -868,7 +889,7 @@
                                 <span v-if="vitem.text">{{ vitem.text }}-</span
                                 >{{ vitem.name }}
                               </div>
-                              <div
+                              <!-- <div
                                 class="downIcon"
                                 @click="downloadFile2(vitem)"
                               >
@@ -876,7 +897,7 @@
                                   src="../../assets/icon/newIcon/down.png"
                                   alt
                                 />
-                              </div>
+                              </div> -->
                             </div>
                           </div>
                         </div>
@@ -1480,6 +1501,14 @@
                               分析
                             </div>
                           </div>
+                          <div v-if="tooC == 73">
+                            <img
+                              src="../../assets/icon/secondToolList/ppt.png"
+                              alt
+                              @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,73)"
+                            />
+                            <div style="margin: 5px 0">PPT</div>
+                          </div>
                           <div v-if="tooC == 65">
                             <img
                               @click="addTools(tooC, toolIndex, taskCount)"
@@ -1547,7 +1576,7 @@
                         </div>
                       </div>
                     </div>
-                    <div class="tooldetail" v-if="tool.toolDetail != ''" :class="{isUpdateToolDetailClass:toolDetailIndex == toolIndex}">
+                    <div class="tooldetail renderedFor" v-if="tool.toolDetail != ''" :class="{isUpdateToolDetailClass:toolDetailIndex == toolIndex}">
                       <!-- <div class="toolTitle">工具描述</div> -->
                       <!-- @click.stop="updateToolDetail(toolIndex, 2)" 点击开启修改-->
                       <div style="height:100%;"
@@ -3888,7 +3917,7 @@
                       <div
                         v-for="(s, sIndex) in noWorksS[toolIndex]"
                         :key="sIndex"
-                        class="noWorksName"
+                        class="noWorksName2"
                         @click="teacherWorkSubmit(72, toolIndex, taskCount, s)"
                       >
                         <el-tooltip
@@ -4464,6 +4493,7 @@
                               word-break: break-word;
                               cursor: pointer;
                             "
+                            class="renderedFor"
                           >
                             {{ index + 1 + "、"  }} <span v-html="renderedFormula(item.teststitle)"></span>
                           </div>
@@ -9657,21 +9687,21 @@
             :key="index1"
           >
             <div class="a_add_head">
-              <div style="display: flex;align-items: center;">
+              <div style="display: flex;">
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (单选题)
                 </div>
                 <div
                   v-if="testJson.testJson[index1].type == '2'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (多选题)
                 </div>
-                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
+                <div class="renderedFor">题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -9790,13 +9820,13 @@
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (单选题)
                 </div>
                 <div
                   v-if="testJson.testJson[index1].type == '2'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (多选题)
                 </div>
@@ -10119,7 +10149,9 @@
               @change="updateLookOpen"
             ></el-switch>
           </div>
-          <div class="switch_box" v-if="courseDetail.userid == userid">
+          <div class="switch_box" v-if="(courseDetail.userid == userid ||
+              (courseDetail.course_teacher &&
+                courseDetail.course_teacher.indexOf(userid) != -1)) && !splitScreenData.isOpen">
             <span>开启跟随模式</span>
             <el-switch
               v-model="IsFollow"
@@ -10595,7 +10627,7 @@
           sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts allow-popups"
           :src="fullUrl"
         ></iframe>
-       
+
       </div>
       <!-- <div slot="footer">
         <el-button @click="fullDialogVisible = false">关 闭</el-button>
@@ -12727,6 +12759,9 @@ export default {
   },
   data() {
     return {
+      // 学校或者组织随机码
+      Code2:'',
+      startTime: "",
       // 是否允许学生查看内容资料 2不可以 1可以
       IsStulook:false,
       homeWorkLoading:false,
@@ -13109,10 +13144,32 @@ export default {
       },
       confirmOpenDig:false,
       confirmOpenDigData:'',
-      diffKey:"1"
+      diffKey:"1",
+      getCourseGroupLoading: false,
+      selectSWorksLoading:false,
+      selectStudentLoading:false,
+      selectSLookLoading:false,
+      getPickLoading:false,
+      selectPzLoading:false,
+      getSplitScreenDataLoading:false,
     };
   },
   methods: {
+    // 获取学校或组织随机码
+    getCode2(){
+      let params = {
+        oid: this.oid,
+        org: this.org
+      };
+      this.ajax
+        .get(this.$store.state.api + "getCode2", params)
+        .then(res => {
+            this.Code2 = res.data[0][0].code2
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
     //查看应用中心作业
     openCocoFlow(w){
       this.$refs.cocoFlowDiaRef.openAppWork(w)
@@ -13448,7 +13505,12 @@ export default {
 					this.insertMemorandum(`选择<span class="variable">阶段${i+1}${this.navList[i].dyName?':'+this.navList[i].dyName:''}</span>→<span class="variable">任务${j+1}${this.navList[i].task[j].taskName?':'+this.navList[i].task[j].taskName:''}</span>→<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
 				}
       }
-
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) &&
+          this.IsFollow) {
+        this.setCTask();
+      }
       // var b = this.$refs["bz" + k][0];
       // a.scrollTop = b.offsetTop;
     },
@@ -14579,6 +14641,8 @@ export default {
         });
     },
     selectStudent() {
+      if(this.selectStudentLoading) return
+      this.selectStudentLoading = true
       //学生查看自己作业
       let params = {
         uid: this.userid,
@@ -14901,8 +14965,12 @@ export default {
               }
             }
           }
+          this.selectStudentLoading = false
+
         })
         .catch((err) => {
+          this.selectStudentLoading = false
+
           console.error(err);
         });
     },
@@ -15258,6 +15326,8 @@ export default {
         .catch(() => {});
     },
     selectSWorks(gindex) {
+      if(this.selectSWorksLoading) return
+      this.selectSWorksLoading = true
       //教师查看全部作业
       let params = {
         cid: this.id,
@@ -15454,6 +15524,10 @@ export default {
                   }
                 } else if (data.type == 8 && a[i].tool[0] == 45) {
                   var checkL = JSON.parse(data.content)[0].anwer;
+                  if(a[i].testJson.testCount != JSON.parse(data.content)[0].testJson.testCount){
+                    continue
+                  }
+                  console.log('选择题')
                   for (var z = 0; z < checkL.length; z++) {
                     if (!this.checkJson[i][z]) {
                       this.checkJson[i].push({
@@ -16357,8 +16431,12 @@ export default {
               }, 0)
             })
           }
+          this.selectSWorksLoading = false
+          
         })
         .catch((err) => {
+          this.selectSWorksLoading = false
+
           console.error(err);
         });
     },
@@ -17112,7 +17190,9 @@ export default {
       this.getHomeWork();
       this.getCourseDetail(2);
       this.$forceUpdate();
-      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
         this.setCTask();
       }
     },
@@ -17224,7 +17304,9 @@ export default {
       this.selectPz();
       this.getHomeWork();
       this.getCourseDetail(2);
-      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
         this.setCTask();
       }
 			if(flag){
@@ -17355,7 +17437,11 @@ export default {
       this.ajax
         .get(this.$store.state.api + "selectCourseDetail3", params)
         .then((res) => {
-          this.addCourseState(1, JSON.parse(res.data[0][0].chapters));
+          if ((this.courseDetail.userid == this.userid ||
+              (this.courseDetail.course_teacher && 
+              this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
+            this.addCourseState(1, JSON.parse(res.data[0][0].chapters));
+          }
           if (type != 2) {
             loading.close();
             if (
@@ -17553,6 +17639,9 @@ export default {
                 } else if (_chapterData[taskCount][0].type == 16) {
                   this.showType = 16;
                   this.pptImgUrl1 = _url;
+                } else if (_chapterData[taskCount][0].type == 17) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -17723,6 +17812,9 @@ export default {
                 } else if (_chapterData[taskCount][0].type == 16) {
                   this.showType = 16;
                   this.pptImgUrl1 = _url;
+                } else if (_chapterData[taskCount][0].type == 17) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -17758,11 +17850,11 @@ export default {
             console.log('this.courseDetail.userid',this.courseDetail.userid);
             console.log('this.userid',this.userid);
 
-            
+
             if (this.courseDetail.userid == this.userid) {
-            
+
               // 开局关闭学生查看内容
-              this.StulookMode(false)
+              this.StulookMode(true)
               // 开局打开跟随模式
               this.followingMode(true)
             }
@@ -17830,6 +17922,11 @@ export default {
           }
           _this.$nextTick(function () {
             setTimeout(() => {
+              const element = document.getElementsByClassName("pb_body")[0];
+              if (element) {
+                  element.style.minHeight = 'unset'
+                  // 或者:element.style.removeProperty("min-height");
+              }
               // var a =
               //   document.getElementsByClassName("box_course")[0].offsetHeight;
               // document.getElementsByClassName("vedioList")[0].style.height =
@@ -17853,6 +17950,8 @@ export default {
         });
     },
     getCourseGroup(gindex) {
+      if(this.getCourseGroupLoading) return
+      this.getCourseGroupLoading = true
       let params = {
         cid: this.id,
         classid: this.tcid ? this.tcid : "1",
@@ -17902,8 +18001,12 @@ export default {
             this.selectSWorks(gindex);
             this.isGroup = false;
           }
+          this.getCourseGroupLoading = false
+
         })
         .catch((err) => {
+          this.getCourseGroupLoading = false
+
           // this.$message.error("网络不佳");
           console.error(err);
         });
@@ -18073,6 +18176,8 @@ export default {
       this.selectPz();
     },
     selectPz() {
+      if(this.selectPzLoading) return
+      this.selectPzLoading = true
       let params = {
         cid: this.id,
         s: this.courseType,
@@ -18095,8 +18200,12 @@ export default {
               }
             }
           }
+          this.selectPzLoading = false
+
         })
         .catch((err) => {
+          this.selectPzLoading = false
+
           console.error(err);
         });
     },
@@ -18160,7 +18269,7 @@ export default {
       this.ajax
         .post(this.$store.state.api + "updateCourseStulook", params)
         .then(res => {
-          
+
           if (this.IsStulook == true) {
             this.$message({
               message: "学生查看内容资料权限已开启",
@@ -18250,6 +18359,8 @@ export default {
         });
     },
     selectSLook() {
+      if(this.selectSLookLoading) return
+      this.selectSLookLoading = true
       let params = {
         cid: this.id,
       };
@@ -18282,8 +18393,12 @@ export default {
               this.getCourseDetail(2);
             }
           }
+          this.selectSLookLoading = false
+
         })
         .catch((err) => {
+          this.selectSLookLoading = false
+
           console.error(err);
         });
     },
@@ -19599,6 +19714,8 @@ export default {
 			this.insertMemorandum(`点击工作区<span class="variable">工具${index+1}:${this.toolsList[t]}</span>`)
     },
     teacherWorkSubmit(t, i, index, s) {
+      console.log('t',t);
+      if(t == 72) return
       this.sStudent = s;
       this.toolindex = i;
       this.sTool = t;
@@ -19977,9 +20094,9 @@ export default {
       if (t == 6) {
         this.fulltype = 1;
         console.log('checkFileFull1',f);
-        
+
         this.fullUrl = JSON.parse(JSON.stringify(f));
-        
+
       } else if (t == 8) {
         this.fulltype = 2;
         this.fullUrl = f.url;
@@ -21072,6 +21189,9 @@ export default {
         });
     },
     getPick() {
+      if(this.getPickLoading) return
+      this.getPickLoading = true
+
       let params = {
         cid: this.id,
       };
@@ -21109,8 +21229,12 @@ export default {
               })
               .catch(() => {});
           }
+          this.getPickLoading = false
+
         })
         .catch((err) => {
+          this.getPickLoading = false
+
           this.$message.error("网络不佳");
           console.error(err);
         });
@@ -21297,6 +21421,8 @@ export default {
     getSplitScreenData() {
       // return;
       // if (this.tType != 1) return;
+      if(this.getSplitScreenDataLoading) return
+      this.getSplitScreenDataLoading = true
       let params = {
         cid: this.id
       };
@@ -21363,8 +21489,12 @@ export default {
                 .catch(() => {});
             }
           }
+          this.getSplitScreenDataLoading = false
+
         })
         .catch(e => {
+          this.getSplitScreenDataLoading = false
+
           console.log("获取分屏数出错:", e);
         });
     },
@@ -21616,6 +21746,22 @@ export default {
     clearInterval(this.opertimer);
     this.opertimer = null;
 		this.updateSplitScreenData(1);
+    if(this.courseDetail.userid == this.userid && this.org == '16ace517-b5c7-4168-a9bb-a9e0035df840'){
+      let endTime = new Date().toLocaleString("zh-CN", { 
+          hour12: false, 
+          timeZone: "Asia/Shanghai" 
+        }).replace(/\//g, "-")
+      let courseTime = Math.floor((new Date(endTime) - new Date(this.startTime)) / (1000 * 60))
+      this.syncClassData({
+        courseId: this.id,
+        title: this.courseDetail.title,
+        courseGrade: this.tcid2 ? this.tcid2 : '',
+        courseTime: courseTime,
+        startTime: this.startTime,
+        endTime: endTime,
+      })
+      console.log('同步数据')
+    }
   },
   computed: {
     renderedFormula2() {
@@ -21624,7 +21770,7 @@ export default {
         const normalized = val
           .replace(/&amp;/g, '&')
           .replace(/<br\/?>/g, '\n');
-        
+
         // 匹配行内公式($...$)和块级公式($$...$$)
         return normalized.replace(/(\${1,2})([^$]+)(\${1,2})/g, (_, delim, expr) => {
           try {
@@ -21822,12 +21968,17 @@ export default {
 
   },
   mounted() {
-    if (this.tType == 1) {
-       // 开局关闭学生查看内容
-      this.StulookMode(false)
-      // 开局打开跟随模式
-      this.followingMode(true)
-    }
+    this.setoTime("1");
+    this.startTime = new Date().toLocaleString("zh-CN", { 
+      hour12: false, 
+      timeZone: "Asia/Shanghai" 
+    }).replace(/\//g, "-")
+    // if (this.tType == 1) {
+    //    // 开局关闭学生查看内容
+    //   this.StulookMode(false)
+    //   // 开局打开跟随模式
+    //   this.followingMode(true)
+    // }
     document.body.addEventListener("click", (e) => {
       if (this.isUpdateToolDetail1) {
         this.updateToolDetail(this.toolDetailIndex);
@@ -21844,6 +21995,7 @@ export default {
     } catch (error) {
       console.log(error)
     }
+    this.getCode2()
     this.setOperationTime();
     this.selectEva();
     this.getCourseDetail(10);
@@ -21873,15 +22025,15 @@ export default {
           a - 40 + "px";
       }
     });
-    let _this = this;
-    setTimeout(() => {
+    // let _this = this;
+    // setTimeout(() => {
       // _this.vedioTime = [];
       // for (var i = 0; i < _this.vedio[_this.taskCount].length; i++) {
       //   _this.vedioTime[i] = document.getElementsByClassName(
       //     "vjs-duration-display"
       //   )[i].textContent;
       // }
-    }, 1000);
+    // }, 1000);
   },
 };
 </script>
@@ -23638,6 +23790,30 @@ export default {
   text-overflow: ellipsis;
   white-space: nowrap;
 }
+.noWorksName2 {
+  background: #fff;
+  color: #0061ff;
+  width: 90px;
+  height: 25px;
+  text-align: center;
+  line-height: 25px;
+  border-radius: 4px;
+  margin: 10px 15px 10px 0;
+  white-space: nowrap;
+  overflow: hidden;
+  padding: 5px;
+  text-overflow: ellipsis;
+  cursor: pointer;
+  border: 1px solid #0061ff;
+}
+
+.noWorksName2 > span {
+  max-width: 100%;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
 
 .isWorksName2 {
   width: 100px;
@@ -26328,4 +26504,23 @@ div::-webkit-scrollbar {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+.renderedFor >>> .katex {
+  font-size: 18px;
+  width: 100%;
+  white-space: normal;
+  font-family: '黑体' !important;
+}
+
+.renderedFor >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
+
+.renderedFor >>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
+}
+.notop >>> .vjs-fluid{
+  padding-top: 0 !important;
+}
 </style>

+ 173 - 77
src/components/index.vue

@@ -1,8 +1,11 @@
 <template>
   <div class="pb_content">
-    <div class="pb_content_body">
-      <div class="student_head" style="position: relative;">
-        <div v-if="gotype" class="r_pub_button_retrun" @click.stop="backliyuan">返回</div>
+    <div class="pb_content_body" :style="{marginTop : gotype ? '75px' : 0}">
+      <div v-if="gotype" class="r_pub_button_retrun" @click.stop="backliyuan">
+        <img src="../assets/icon/course/backPage.svg" alt="">
+        AI通识课
+      </div>
+      <div class="student_head" v-else>
 
         <!-- <img src="../assets/banner.png" alt="" /> -->
          <!-- //pbl.cocorobo.cn/pbl-teacher-table/dist -->
@@ -66,28 +69,27 @@
         <div class="typeCheck">
           <div><el-switch v-model="orderBy"></el-switch><span>按名字排序</span></div>
           <div><el-switch v-model="typeCheck"></el-switch><span>分类显示</span></div>
+          <div v-if="oidArray.indexOf(oid) !== -1"><el-switch v-model="typeCheck2"></el-switch><span>按年级显示</span></div>
         </div>
         <div>
-          <div class="main_box">
-            <div style="display:flex;flex-wrap:wrap" v-if="!typeCheck">
-              <div class="box_course" v-for="(item, index) in zoneClass" :key="index"  @click="
-                  goTo(
-                    '/courseDetail?courseId=' +
-                    item.courseId +
-                    '&userid=' +
-                    userid +
-                    '&oid=' +
-                    oid +
-                    '&org=' +
-                    org +
-                    '&cid=' +
-                    classId +
-                    '&tType=' +
-                    tType +
-                    '&screenType=' +
-                    screenType,item.courseId
-                  )
-                ">
+           <div class="main_box">
+            <div :class="zoneClass.length > 5 ? 'claList' : 'claListFlex'" v-if="!typeCheck && !typeCheck2">
+              <div :class="zoneClass.length > 5 ? 'box_course' : 'box_courseFlex'" v-for="(item, index) in zoneClass" :key="index"  @click="goTo(
+          '/courseDetail?courseId=' +
+          item.courseId +
+          '&userid=' +
+          userid +
+          '&oid=' +
+          oid +
+          '&org=' +
+          org +
+          '&cid=' +
+          classId +
+          '&tType=' +
+          tType +
+          '&screenType=' +
+          screenType,item.courseId
+        )">
                 <div class="wheel">
                   <img :src="
                     item.cover
@@ -100,7 +102,7 @@
                     <el-tooltip effect="light" :content="item.title" placement="top">
                       <span class="utitle">{{ item.title }}</span>
                     </el-tooltip>
-                    <el-tooltip effect="light" :content="item.uname" placement="top">
+                    <el-tooltip effect="light" :content="item.uname" placement="top" v-if="oidArray.indexOf(oid) == -1">
                       <span class="uname">{{ item.uname }}</span>
                     </el-tooltip>
                   </div>
@@ -145,25 +147,23 @@
             <div v-else>
               <div class="FirstTypeBox" v-for="(type, tindex) in CourseType2" :key="tindex">
                 <div class="title">{{ type.name }}</div>
-                <div style="display: flex;flex-flow: wrap;margin-top: 20px;">
-                  <div class="box_course" v-for="(item, index) in type.course" :key="tindex + '-' + index" @click="
-                     goTo(
-                        '/courseDetail?courseId=' +
-                        item.courseId +
-                        '&userid=' +
-                        userid +
-                        '&oid=' +
-                        oid +
-                        '&org=' +
-                        org +
-                        '&cid=' +
-                        classId +
-                        '&tType=' +
-                        tType +
-                        '&screenType=' +
-                        screenType,item.courseId
-                      )
-                    ">
+                <div class="typeCheckFlex" style="margin-top: 20px;">
+                  <div class="box_courseFlex" v-for="(item, index) in type.course" :key="tindex + '-' + index" @click="goTo(
+          '/courseDetail?courseId=' +
+          item.courseId +
+          '&userid=' +
+          userid +
+          '&oid=' +
+          oid +
+          '&org=' +
+          org +
+          '&cid=' +
+          classId +
+          '&tType=' +
+          tType +
+          '&screenType=' +
+          screenType,item.courseId
+        )">
                     <div class="wheel">
                       <img :src="
                         item.cover
@@ -176,7 +176,7 @@
                         <el-tooltip effect="light" :content="item.title" placement="top">
                           <span class="utitle">{{ item.title }}</span>
                         </el-tooltip>
-                        <el-tooltip effect="light" :content="item.uname" placement="top">
+                        <el-tooltip effect="light" :content="item.uname" placement="top" v-if="oidArray.indexOf(oid) == -1">
                           <span class="uname">{{ item.uname }}</span>
                         </el-tooltip>
                       </div>
@@ -225,7 +225,7 @@
             </div>
           </div>
         </div>
-        <div class="student_page" style="margin: 15px 0 0" v-if="zoneClass.length > 0 && !typeCheck">
+        <div class="student_page" style="margin: 15px 0 0" v-if="zoneClass.length > 0 && !typeCheck && !typeCheck2">
           <el-pagination background layout="prev, pager, next" :page-size="pageSize" :total="total" v-if="page"
             @current-change="handleCurrentChange">
           </el-pagination>
@@ -243,7 +243,7 @@ export default {
 
   data() {
     return {
-      gotype:sessionStorage.getItem('gotype'),
+      gotype: sessionStorage.getItem('gotype'),
       zoneList: [],
       zoneClass: [],
       page: 1,
@@ -271,25 +271,59 @@ export default {
       typeE: [],
       loading: "",
       typeCheck: false,
+      typeCheck2: false,
+      isUpdatingChecks: false,
       orderBy: false,
       CourseType3: [],
       pTypeCheck:[],
       pTypeCheckName: [],
+      oidArray: ['91305d49-01ba-11ed-8c78-005056b86db4']
     };
   },
   watch: {
     typeCheck(newValue, oldValue) {
-      this.loading = true
+      if (this.isUpdatingChecks) return;
+      
+      this.isUpdatingChecks = true;
+      this.typeCheck2 = false;
+      
       if (newValue) {
-        this.selectAll()
+        this.loading = true;
+        this.selectAll();
+      } else if (!this.typeCheck2) {
+        this.loading = true;
+        this.page = 1;
+        this.selectAll2();
+      }
+      
+      this.$nextTick(() => {
+        this.isUpdatingChecks = false;
+      });
+    },
+    typeCheck2(newValue, oldValue) {
+      if (this.isUpdatingChecks) return;
+      
+      this.isUpdatingChecks = true;
+      this.typeCheck = false;
+      
+      if (newValue) {
+        this.loading = true;
+        this.selectAll();
+      } else if (!this.typeCheck) {
+        this.page = 1;
+        this.loading = true;
+        this.selectAll2();
       } else {
-        this.page = 1
-        this.selectAll2()
+        this.loading = false;
       }
+      
+      this.$nextTick(() => {
+        this.isUpdatingChecks = false;
+      });
     },
     orderBy(newValue, oldValue) {
       this.loading = true
-      if (this.typeCheck) {
+      if (this.typeCheck || this.typeCheck2) {
         this.selectAll()
       } else {
         this.page = 1
@@ -305,9 +339,15 @@ export default {
       }else{
         window.location.href = `https://pbl.cocorobo.cn/pbl-teacher-table/dist/#/CourseCon?userid=${this.userid}&oid=${this.oid}&org=${this.org}&role=${this.role}&tType=${this.tType}`
       }
+      try {
+        window.topU.gotype = '' 
+      } catch (error) {
+        console.log(error);
+      }
+      sessionStorage.removeItem('gotype');
     },
     search(){
-      if(this.typeCheck){
+      if(this.typeCheck || this.typeCheck2){
         this.selectAll()
       }else{
         this.page = 1
@@ -508,9 +548,9 @@ export default {
         }
       }
       this.loading = true;
-      if (this.typeCheck) {
+      if (this.typeCheck || this.typeCheck2) {
         this.selectAll();
-      } else {
+      }else {
         this.selectAll2();
       }
     },
@@ -529,14 +569,14 @@ export default {
           }
         }
       }
-      
+
       this.typea = ""
       this.typeb = ""
       this.typed = ""
       this.loading = true;
-      if (this.typeCheck) {
+      if (this.typeCheck || this.typeCheck2) {
         this.selectAll();
-      } else {
+      }else {
         this.selectAll2();
       }
     },
@@ -582,7 +622,16 @@ export default {
           this.isListAjax = false;
           this.zoneClass = res.data[0];
           // this.total = res.data[0].length ? res.data[0][0].num : 0;
-          let CourseType2 = JSON.parse(JSON.stringify(this.CourseType[0]))
+          let CourseType2 = []
+          if(this.typeCheck){
+            CourseType2 = JSON.parse(JSON.stringify(this.CourseType[0]))
+          }else if(this.typeCheck2){
+            CourseType2 = JSON.parse(JSON.stringify(this.CourseType[2].filter(item => {
+              return item.pid == "34628934-d02f-11ec-8c78-005056b86db5"
+            })))
+          }else{
+            CourseType2 = JSON.parse(JSON.stringify(this.CourseType[0]))
+          }
           if(this.oid == "69893dca-1d47-11ed-8c78-005056b86db5"){
             if(this.pTypeCheckName.length){
               CourseType2 = this.CourseType3.filter(el => {
@@ -600,8 +649,14 @@ export default {
               // }
               let pid = CourseType2[i].id
               if(typeof pid != "object") pid = pid.split(",")
-              if(res.data[0][j].pid && this.arrayToArray(pid,res.data[0][j].pid.split(",")).length){
-                CourseType2[i].course.push(res.data[0][j])
+              if(this.typeCheck2){
+                if(res.data[0][j].typeid && this.arrayToArray(pid,res.data[0][j].typeid.split(",")).length){
+                  CourseType2[i].course.push(res.data[0][j])
+                }
+              }else {
+                if(res.data[0][j].pid && this.arrayToArray(pid,res.data[0][j].pid.split(",")).length){
+                  CourseType2[i].course.push(res.data[0][j])
+                }
               }
             }
           }
@@ -818,7 +873,7 @@ export default {
               }
             }
           }
-          if (this.typeCheck) {
+          if (this.typeCheck || this.typeCheck2) {
             this.selectAll();
           } else {
             this.selectAll2();
@@ -915,6 +970,9 @@ export default {
     let typea = this.$route.query.typea
     let typeb = this.$route.query.typeb
     let typed = this.$route.query.typed
+    if(this.oidArray.indexOf(this.oid) !== -1){
+      this.typeCheck2 = true
+    }
     if(typea || typeb || typed){
       this.typea = typea ? typea : ''
       this.typeb = typeb ? typeb : ''
@@ -935,9 +993,16 @@ export default {
 
 <style scoped>
 @media screen and (max-width: 1024px) {
-  .box_course {
-    margin: 0px 5px 20px 5px !important;
-  }
+  /* .box_course {
+    width: 300px !important;
+  } */
+  .typeCheckFlex{
+      display: grid !important;  
+      grid-template-columns: repeat(3, 1fr) !important; 
+   }
+   .claList{
+      grid-template-columns: repeat(3, 1fr) !important; 
+   }
 }
 
 .student_head .imgS {
@@ -1002,9 +1067,10 @@ export default {
   flex-direction: column;
   flex-wrap: nowrap;
   /* margin: 0px 1% 20px; */
-  margin: 0 15px 20px 0;
-  width: 300px;
+  /* margin: 0 15px 20px 0; */
+  /* width: 300px; */
   /* height: 260px; */
+  max-width: 400px;
   /*border: 1px solid #cecece; */
   border-radius: 10px;
   overflow: hidden;
@@ -1337,19 +1403,21 @@ export default {
   z-index: 999999;
 }
 .r_pub_button_retrun {
-  position: absolute;
-  top: 20px;
-  left: 20px;
-  z-index: 999999;
-  color: #000;
-  font-size: 14px;
+  font-weight: bold;
+  font-size: 20px;
+  display: flex;align-items: center;
+  gap: 10px;
   cursor: pointer;
-  display: flex;
-  align-items: center;
-  justify-content: center;
+  /* padding:0px 90px 0; */
+  /* height: 23.8px; */
+  margin-bottom: 15px;
+  width: 90%;
+  margin: auto;
+  transform: translate(0px, -35px);
+
 }
 
-.r_pub_button_retrun::before {
+/* .r_pub_button_retrun::before {
   content: "";
   width: 14px;
   height: 14px;
@@ -1359,5 +1427,33 @@ export default {
   display: block;
   margin-right: 7px;
   background-image: url(../assets/icon/course/icon_return2.png);
-}
+} */
+ .claList{
+    display: grid;
+    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+    gap: 30px;
+ }
+ .claListFlex{
+  display: grid;
+  grid-template-columns: repeat(4, 1fr);
+  gap: 30px;
+ }
+ .box_courseFlex{
+    display: flex;
+    flex-direction: column;
+    flex-wrap: nowrap;
+    /* max-width: 400px; */
+    flex: 1;
+    border-radius: 10px;
+    overflow: hidden;
+    box-shadow: 0px 1px 3px 0px rgb(0 0 0 / 20%), 0px 1px 1px 0px rgb(0 0 0 / 14%),
+      0px 2px 1px -1px rgb(0 0 0 / 12%);
+    justify-content: space-between;
+    cursor: pointer;
+ }
+ .typeCheckFlex{
+    display: grid; 
+    grid-template-columns: repeat(4, 1fr); 
+    gap: 30px;
+ }
 </style>

+ 459 - 0
src/components/pptEasyClass/index.vue

@@ -0,0 +1,459 @@
+<template>
+  <div class="pptEasyClass">
+    <div class="pec_main" v-loading="pageLoading">
+      <div class="pec_header">
+        <div class="pec_h_left">
+          <div @click.stop="back" class="backBtn" v-if="screenType != 2 || tType == 1">
+            <img src="../../assets/icon/newIcon/return.svg" alt="" />
+          </div>
+          <div v-if="tcid" class="class-info-group">
+            <span class="class-label">班级</span>
+            <span class="class-value">{{ className }}</span>
+          </div>
+          <div v-if="tcid" class="class-info-group">
+            <span class="class-label" v-if="inviteCode">识别码</span>
+            <span class="class-value" v-if="inviteCode">{{ inviteCode }}</span>
+          </div>
+        </div>
+        <div class="pec_h_center">
+          <div class="pec_h_l_title">
+            <span>{{ courseDetail.title }}</span>
+          </div>
+          <div class="free-browse-switch" v-if="courseDetail.userid == userid">
+            <span class="switch-label" :class="{ active: freeBrowse }">{{ freeBrowse ? '自由浏览' : '跟随模式' }}</span>
+            <el-switch
+              v-model="freeBrowse"
+              :active-value="true"
+              :inactive-value="false"
+              class="custom-switch"
+              active-color="#FCCF00"
+              inactive-color="#F53F3F"
+              @change="onFreeBrowseChange"
+            ></el-switch>
+          </div>
+          <div class="free-browse-switch" v-if="tType == 2">
+            <span class="switch-label" :class="{ active: freeBrowse }">{{ freeBrowse ? '自由浏览' : '跟随模式' }}</span>
+          </div>
+        </div>
+        <div class="pec_h_right">
+          <div class="pec_h_r_btnArea">
+            <!-- <el-tooltip effect="light" content="刷新" placement="top">
+              <div class="pec_h_r_btn_refresh" @click="refreshCourse">
+                <img src="../../assets/icon/newIcons/refresh.png" alt="" />
+                <span>刷新</span>
+              </div>
+            </el-tooltip> -->
+            <div class="pec_h_r_btn_afterClass" @click="afterClass" v-if="courseDetail.userid == userid">
+              <img src="../../assets/icon/newIcon/afterClass.svg" alt="" />
+              <span>下课</span>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="pec_content">
+        <iframe allow="camera *; microphone *;display-capture;midi;encrypted-media;clipboard-write;clipboard-read"
+          webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" frameborder="no" border="0" :src="iframeSrc"
+          v-if="showIframe" style="width: 100%; height: 100%; border: none" ref="ppt"></iframe>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { myMixin } from '../../mixins/mixin';
+
+export default {
+  mixins: [myMixin],
+  data() {
+    return {
+      id: this.$route.query.courseId,
+      userid: this.$route.query.userid,
+      classId: this.$route.query.cid,
+      role: this.$route.query.role,
+      oid: this.$route.query.oid,
+      org: this.$route.query.org,
+      tType: this.$route.query.tType,
+      courseType: this.$route.query.type,
+      screenType: this.$route.query.screenType,
+      tcid2: this.$route.query.tcid,
+      tcid: "",
+      className: "",
+      showIframe: false,
+      iframeSrc: "",
+      courseDetail: {},
+      pageLoading: false,
+      inviteCode: "",
+      startTime: "",
+      freeBrowse: true, // 默认自由浏览
+      opertimer: null, // 定时器
+    };
+  },
+  methods: {
+    goTo(path) {
+      this.$router.push(path);
+    },
+    refreshCourse() {
+      this.getCourseDetail();
+    },
+    getCourseDetail() {
+      this.pageLoading = true;
+      let params = {
+        courseId: this.id
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "selectCourseDetail3", params)
+        .then(res => {
+          console.log("getCourseDetail", res);
+          this.courseDetail = res.data[0][0];
+          this.courseDetail.chapters = JSON.parse(this.courseDetail.chapters);
+          this.tcid = this.arrayToArray(
+            this.courseDetail.juri ? this.courseDetail.juri.split(",") : [],
+            this.tcid2 ? this.tcid2.split(",") : []
+          )[0] || "";
+          if (this.tcid && res.data[1].length) {
+            let _inviteA = [];
+            for (var ik = 0; ik < res.data[1].length; ik++) {
+              _inviteA.push({
+                cid: res.data[1][ik].classid,
+                ic: res.data[1][ik].code,
+              });
+            }
+            for (var ik = 0; ik < _inviteA.length; ik++) {
+              if (
+                this.arrayToArray(
+                  _inviteA[ik].cid.split(","),
+                  this.tcid.split(",")
+                ).length
+              ) {
+                this.inviteCode = _inviteA[ik].ic;
+                break;
+              }
+            }
+          }
+          this.setPptIframe()
+          this.pageLoading = false;
+        })
+        .catch(err => {
+          console.log(err);
+          this.$message.error("获取课程数据失败");
+          this.pageLoading = false;
+        });
+    },
+    setPptIframe() {
+      this.showIframe = false;
+
+      this.$nextTick(() => {
+        let api = ''
+        if (this.$region == 'beta') {
+          api = 'https://beta.ppt.cocorobo.cn'
+        } else {
+          api = 'https://ppt.cocorobo.cn'
+        }
+        let _url = api + `/?mode=student&courseid=${this.id}&userid=${this.userid}&oid=${this.oid}&org=${this.org}&cid=${this.tcid}&type=${this.tType}`;
+
+        this.iframeSrc = _url;
+
+        this.showIframe = true;
+      });
+    },
+    arrayToArray(arrayo, arrayt) {
+      let array1 = arrayo;
+      let array2 = arrayt;
+
+      let commonElements = [];
+
+      for (let i = 0; i < array1.length; i++) {
+        for (let j = 0; j < array2.length; j++) {
+          if (array1[i] === array2[j]) {
+            commonElements.push(array1[i]);
+          }
+        }
+      }
+      return commonElements;
+    },
+    async getClassName() {
+      let courseGrade = await this.ajax.get(this.$store.state.api + "getClassById", { id: this.tcid2 });
+      this.className = courseGrade.data[0][0].grade;
+    },
+    back() {
+      if (this.tType != 2) {
+        this.goTo(
+          '/courseDetail?userid=' +
+          this.userid +
+          '&oid=' +
+          this.oid +
+          '&org=' +
+          this.org +
+          '&cid=' +
+          this.classId +
+          '&courseId=' +
+          this.id +
+          '&tType=' +
+          this.tType +
+          '&screenType=' +
+          this.screenType
+        )
+      } else {
+        this.goTo(
+          '/index?userid=' +
+          this.userid +
+          '&oid=' +
+          this.oid +
+          '&org=' +
+          this.org +
+          '&cid=' +
+          this.classId +
+          '&tType=' +
+          this.tType +
+          '&screenType=' +
+          this.screenType
+        )
+      }
+    },
+    afterClass() {
+      this.$confirm('此操作将使当前课程内所有学生退出登录,是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.$refs.ppt.contentWindow.PPTistStudent.forceLogout();
+      }).catch(() => {});
+    },
+    onFreeBrowseChange(value) {
+      this.freeBrowse = value;
+      console.log('自由浏览模式已切换为1:', this.freeBrowse);
+      this.$refs.ppt.contentWindow.PPTistStudent.toggleFollowMode()
+    },
+    setOperationTime() {
+      let _this = this;
+      if (_this.opertimer) {
+        clearInterval(_this.opertimer);
+        _this.opertimer = null;
+      }
+      _this.opertimer = setInterval(() => {
+        _this.setoTime("600");
+      }, 600000);
+    },
+    setoTime(time) {
+      let params = [
+        {
+          uid: this.userid,
+          cid: this.id,
+          type: "2",
+          time: time,
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "addOperationTimeT2", params)
+        .then((res) => {})
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+  },
+  destroyed() {
+    clearInterval(this.opertimer);
+    this.opertimer = null;
+    if (this.courseDetail.userid == this.userid && this.org == '16ace517-b5c7-4168-a9bb-a9e0035df840') {
+      let endTime = new Date().toLocaleString("zh-CN", {
+        hour12: false,
+        timeZone: "Asia/Shanghai"
+      }).replace(/\//g, "-")
+      let courseTime = Math.floor((new Date(endTime) - new Date(this.startTime)) / (1000 * 60))
+      this.syncClassData({
+        courseId: this.id,
+        title: this.courseDetail.title,
+        courseGrade: this.tcid2 ? this.tcid2 : '',
+        courseTime: courseTime,
+        startTime: this.startTime,
+        endTime: endTime,
+      })
+      console.log('同步数据')
+    }
+  },
+  mounted() {
+    this.setoTime("1");
+    this.startTime = new Date().toLocaleString("zh-CN", {
+      hour12: false,
+      timeZone: "Asia/Shanghai"
+    }).replace(/\//g, "-")
+    this.getClassName()
+    this.getCourseDetail();
+    this.setOperationTime();
+    window.onFreeBrowseChange = (value) => {
+      this.freeBrowse = value;
+      console.log('自由浏览模式已切换为:', this.freeBrowse);
+    }
+  }
+};
+</script>
+
+<style scoped>
+.pptEasyClass {
+  width: 100vw;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+  box-sizing: border-box;
+  background-color: #f2f2f2;
+}
+
+.pec_main {
+  width: 100%;
+  height: 100%;
+  background-color: #fff;
+}
+
+.pec_header {
+  width: 100%;
+  height: 60px;
+  background: #FCCF00;
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  position: relative;
+  box-shadow: 0px 4px 12px 0px #3648601F;
+  padding: 0 10px;
+  box-sizing: border-box;
+}
+
+.pec_h_left {
+  width: auto;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  gap: 25px;
+  /* 保持左侧靠左 */
+}
+
+.pec_h_center {
+  position: absolute;
+  left: 50%;
+  top: 0;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  transform: translateX(-50%);
+  z-index: 1;
+}
+
+.pec_h_l_title {
+  font-weight: bold;
+  font-size: 20px;
+  color: #0e1e33;
+}
+
+.pec_h_right {
+  width: auto;
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+
+.pec_h_r_btnArea {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.pec_h_r_btnArea>div {
+  width: auto;
+  height: auto;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 10px 20px;
+  background-color: #f0f4fa;
+  border-radius: 4px;
+  cursor: pointer;
+  font-size: 14px;
+  font-weight: 400;
+  color: #000;
+  border: 1px solid #cad1dc;
+}
+
+.pec_h_r_btnArea>div>img {
+  width: 15px;
+  height: 15px;
+  margin-right: 5px;
+}
+
+.pec_h_r_btnArea>.pec_h_r_btn_refresh {
+  color: #fff;
+  background-color: #0061ff;
+  border-color: #0061ff;
+}
+
+.pec_h_r_btnArea>.pec_h_r_btn_afterClass {
+  border-color: #F0E1DD;
+  background-color: #FFF7F5;
+  color: #F53F3F;
+}
+
+.backBtn {
+  width: 15px;
+  height: 15px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+}
+
+.backBtn img {
+  width: 100%;
+  height: 100%;
+}
+
+.class-info-group {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.class-label {
+  font-size: 18px;
+  font-weight: bold;
+  color: #222;
+  margin-right: 5px;
+}
+
+.class-value {
+  font-size: 16px;
+  color: #222;
+  background: #FFFFFF3D;
+  border: 1px solid #00000080;
+  border-radius: 5px;
+  padding: 5px 18px;
+  min-width: 60px;
+  text-align: center;
+  display: inline-block;
+  box-sizing: border-box;
+}
+
+.pec_content {
+  width: 100%;
+  height: calc(100% - 60px);
+  border-radius: 0 0 12px 12px;
+  background-color: #fff;
+}
+
+.free-browse-switch {
+  display: flex;
+  align-items: center;
+  padding: 9px 10px;
+  background: #FFF7F5;
+  border-radius: 26px;
+  margin-left: 15px;
+  gap: 5px;
+}
+
+.switch-label {
+  background: linear-gradient(to right, #F53F3F, #FCCF00);
+  -webkit-background-clip: text;
+  color: transparent;
+}
+</style>

+ 341 - 0
src/components/pptEasyClass/index_old.vue

@@ -0,0 +1,341 @@
+<template>
+  <div class="pptEasyClass">
+    <div class="pec_main" v-loading="pageLoading">
+      <div class="pec_header">
+        <div class="pec_h_left">
+          <div class="pec_h_l_title">
+            <span>{{ courseDetail.title }}</span>
+          </div>
+
+          <div v-if="tcid && inviteCode" class="inviteBox" style="margin-left: 20px;">
+              <span>识别码:{{ inviteCode }}</span>
+            </div>
+        </div>
+
+        <div class="pec_h_right">
+          <div class="pec_h_r_btnArea">
+            <el-tooltip effect="light" content="刷新" placement="top">
+              <div class="pec_h_r_btn_refresh" @click="refreshCourse">
+                <img src="../../assets/icon/newIcons/refresh.png" alt="" />
+                <span>刷新</span>
+              </div>
+            </el-tooltip>
+
+            <div
+              @click.stop="back"
+              v-if="tType == 1 || screenType!=2"
+            >
+              <img src="../../assets/icon/newIcon/return.png" alt="" />
+              <span style="color: #000">返回</span>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="pec_content">
+        <iframe allow="camera *; microphone *;display-capture;midi;encrypted-media;clipboard-write;clipboard-read" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" frameborder="no" border="0" :src="iframeSrc" v-if="showIframe" style="width: 100%; height: 100%; border: none"></iframe>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { myMixin } from '../../mixins/mixin';
+
+export default {
+  mixins: [myMixin],
+  data() {
+    return {
+      id: this.$route.query.courseId,
+      userid: this.$route.query.userid,
+      classId: this.$route.query.cid,
+      role: this.$route.query.role,
+      oid: this.$route.query.oid,
+      org: this.$route.query.org,
+      tType: this.$route.query.tType,
+      courseType: this.$route.query.type,
+      screenType: this.$route.query.screenType,
+      tcid2: this.$route.query.tcid,
+      tcid:"",
+      showIframe: false,
+      iframeSrc: "",
+      courseDetail: {},
+      pageLoading: false,
+      inviteCode:"",
+      startTime: "",
+      opertimer: null, // 定时器
+    };
+  },
+  methods: {
+    goTo(path) {
+      this.$router.push(path);
+    },
+    refreshCourse() {
+      this.getCourseDetail();
+    },
+    getCourseDetail() {
+      this.pageLoading = true;
+      let params = {
+        courseId: this.id
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "selectCourseDetail3", params)
+        .then(res => {
+          console.log("getCourseDetail", res);
+          this.courseDetail = res.data[0][0];
+          this.courseDetail.chapters = JSON.parse(this.courseDetail.chapters);
+          this.tcid = this.arrayToArray(
+            this.courseDetail.juri ? this.courseDetail.juri.split(",") : [],
+            this.tcid2 ? this.tcid2.split(",") : []
+          )[0] || "";
+          if (this.tcid && res.data[1].length) {
+            let _inviteA = [];
+            for (var ik = 0; ik < res.data[1].length; ik++) {
+              _inviteA.push({
+                cid: res.data[1][ik].classid,
+                ic: res.data[1][ik].code,
+              });
+            }
+            for (var ik = 0; ik < _inviteA.length; ik++) {
+              if (
+                this.arrayToArray(
+                  _inviteA[ik].cid.split(","),
+                  this.tcid.split(",")
+                ).length
+              ) {
+                this.inviteCode = _inviteA[ik].ic;
+                break;
+              }
+            }
+          }
+          this.setPptIframe()
+          this.pageLoading = false;
+        })
+        .catch(err => {
+          console.log(err);
+          this.$message.error("获取课程数据失败");
+          this.pageLoading = false;
+        });
+    },
+    setPptIframe() {
+      this.showIframe = false;
+
+      this.$nextTick(() => {
+        let _url = `https://ppt.cocorobo.cn/?mode=student&courseid=${this.id}&userid=${this.userid}&oid=${this.oid}&org=${this.org}&cid=${this.tcid}&type=${this.tType}`;
+
+        this.iframeSrc = _url;
+
+        this.showIframe = true;
+      });
+    },
+    arrayToArray(arrayo, arrayt) {
+      let array1 = arrayo;
+      let array2 = arrayt;
+
+      let commonElements = [];
+
+      for (let i = 0; i < array1.length; i++) {
+        for (let j = 0; j < array2.length; j++) {
+          if (array1[i] === array2[j]) {
+            commonElements.push(array1[i]);
+          }
+        }
+      }
+      return commonElements;
+    },
+    back(){
+      if(this.tType!=2){
+        this.goTo(
+          '/courseDetail?userid=' +
+            this.userid +
+            '&oid=' +
+            this.oid +
+            '&org=' +
+            this.org +
+            '&cid=' +
+            this.classId +
+            '&courseId=' +
+            this.id +
+            '&tType=' +
+            this.tType +
+            '&screenType=' +
+            this.screenType
+        )
+      }else{
+        this.goTo(
+          '/index?userid=' +
+            this.userid +
+            '&oid=' +
+            this.oid +
+            '&org=' +
+            this.org +
+            '&cid=' +
+            this.classId +
+            '&tType=' +
+            this.tType +
+            '&screenType=' +
+            this.screenType
+        )
+      }
+    },
+    setOperationTime() {
+      let _this = this;
+      if (_this.opertimer) {
+        clearInterval(_this.opertimer);
+        _this.opertimer = null;
+      }
+      _this.opertimer = setInterval(() => {
+        _this.setoTime("600");
+      }, 600000);
+    },
+    setoTime(time) {
+      let params = [
+        {
+          uid: this.userid,
+          cid: this.id,
+          type: "2",
+          time: time,
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "addOperationTimeT2", params)
+        .then((res) => {})
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+  },
+  destroyed() {
+    clearInterval(this.opertimer);
+    this.opertimer = null;
+    if (this.courseDetail.userid == this.userid && this.org == '16ace517-b5c7-4168-a9bb-a9e0035df840') {
+      let endTime = new Date().toLocaleString("zh-CN", {
+        hour12: false,
+        timeZone: "Asia/Shanghai"
+      }).replace(/\//g, "-")
+      let courseTime = Math.floor((new Date(endTime) - new Date(this.startTime)) / (1000 * 60))
+      this.syncClassData({
+        courseId: this.id,
+        title: this.courseDetail.title,
+        courseGrade: this.tcid2 ? this.tcid2 : '',
+        courseTime: courseTime,
+        startTime: this.startTime,
+        endTime: endTime,
+      })
+      console.log('同步数据')
+    }
+  },
+  mounted() {
+    this.setoTime("1");
+    this.startTime = new Date().toLocaleString("zh-CN", {
+      hour12: false,
+      timeZone: "Asia/Shanghai"
+    }).replace(/\//g, "-")
+    this.getCourseDetail();
+    this.setOperationTime();
+  }
+};
+</script>
+
+<style scoped>
+.pptEasyClass {
+  width: 100vw;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+  box-sizing: border-box;
+  padding: 20px;
+  background-color: #f2f2f2;
+}
+
+.pec_main {
+  width: 100%;
+  height: 100%;
+  background-color: #fff;
+  border-radius: 12px;
+}
+
+.pec_header {
+  width: 100%;
+  height: 80px;
+  border-radius: 12px 12px 0 0;
+  box-sizing: border-box;
+  border-bottom: solid 1px #cad1dc;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.pec_h_left {
+  width: auto;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-left: 20px;
+  font-weight: bold;
+  font-size: 20px;
+  color: #0e1e33;
+}
+
+.pec_h_right {
+  width: auto;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-right: 20px;
+}
+
+.pec_h_r_btnArea {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.pec_h_r_btnArea > div {
+  width: auto;
+  height: auto;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 10px 20px;
+  background-color: #f0f4fa;
+  border-radius: 4px;
+  cursor: pointer;
+  margin-right: 10px;
+  font-size: 14px;
+  font-weight: 400;
+  color: #000;
+  border: 1px solid #cad1dc;
+}
+
+.pec_h_r_btnArea > div > img {
+  width: 15px;
+  height: 15px;
+  margin-right: 5px;
+}
+
+.pec_h_r_btnArea > .pec_h_r_btn_refresh {
+  color: #fff;
+  background-color: #0061ff;
+  border-color: #0061ff;
+}
+
+.pec_content {
+  width: 100%;
+  height: calc(100% - 80px);
+  border-radius: 0 0 12px 12px;
+  background-color: #fff;
+}
+
+
+.inviteBox {
+  font-size: 14px;
+  /* margin-top: 5px; */
+  color: #00000099;
+  text-align: center;
+}
+</style>

+ 216 - 42
src/components/studyStudent.vue

@@ -75,7 +75,8 @@
             style="padding: 0 0 8px 0"
           >
             <div>
-              <span>随机码:{{ inviteCode }}</span>
+              <!-- <span>识别码:{{ inviteCode }}</span> -->
+              <span>识别码:{{ Code2 ? Code2 + inviteCode : inviteCode }}</span>
             </div>
           </div>
         </div>
@@ -484,6 +485,7 @@
                   flex-direction: column;
                   position: relative;
                 "
+                class="renderedFor"
               >
                 <div
                   style="
@@ -534,12 +536,12 @@
                       style="height: 650px; width: calc(100% - 50px)"
                     >
                       <video-player
-                        class="video-player vjs-custom-skin"
+                        class="video-player vjs-custom-skin notop"
                         :class="contentDialog == false ? 'isAllWidth' : ''"
                         :playsinline="true"
                         :options="playerO[taskCount]"
                         @play="onPlayerPlay($event)"
-                        style="width: 100%; height: 100%; margin: 0 0 0 30px"
+                        style="width: 100%; height: 650px; margin: 0 0 0 30px"
                       ></video-player>
                     </div>
                   </div>
@@ -697,9 +699,9 @@
                               <span v-if="vitem.text">{{ vitem.text }}-</span
                               >{{ vitem.name }}
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img src="../assets/icon/newIcon/down.png" alt />
-                            </div>
+                            </div> -->
                           </div>
 
                           <div class="navListItem" v-if="vitem.type == 6">
@@ -759,9 +761,9 @@
                                 alt
                               />
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img src="../assets/icon/newIcon/down.png" alt />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 12">
                             <div class="navText" @click="downloadFile2(vitem)">
@@ -777,9 +779,9 @@
                                 alt
                               />
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img src="../assets/icon/newIcon/down.png" alt />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 13">
                             <div
@@ -789,9 +791,9 @@
                             >
                               {{ vitem.name }}
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img src="../assets/icon/newIcon/down.png" alt />
-                            </div>
+                            </div> -->
                           </div>
                             <div class="navListItem" v-if="vitem.type == 16">
                               <div
@@ -811,6 +813,24 @@
                                 />
                               </div>
                           </div>
+                          <div class="navListItem" v-if="vitem.type == 17">
+                              <div
+                                class="navText"
+                                @click="checkHtml(vitem, vindex)"
+                                :class="isClickNav == vindex ? 'isClickNav' : ''"
+                              >
+                                {{ vitem.name }}
+                              </div>
+                              <div
+                                class="downIcon"
+                                @click="checkFileFull1(vitem.type, vitem)"
+                              >
+                                <img
+                                  src="../assets/icon/newIcon/allScreen.png"
+                                  alt
+                                />
+                              </div>
+                          </div>
                         </div>
 
                         <div
@@ -828,7 +848,7 @@
                                 <span v-if="vitem.text">{{ vitem.text }}-</span
                                 >{{ vitem.name }}
                               </div>
-                              <div
+                              <!-- <div
                                 class="downIcon"
                                 @click="downloadFile2(vitem)"
                               >
@@ -836,7 +856,7 @@
                                   src="../assets/icon/newIcon/down.png"
                                   alt
                                 />
-                              </div>
+                              </div> -->
                             </div>
                           </div>
                         </div>
@@ -1507,7 +1527,7 @@
                         </div>
                       </div>
                     </div>
-                    <div class="tooldetail" v-if="tool.toolDetail != ''" :class="{isUpdateToolDetailClass:toolDetailIndex == toolIndex}">
+                    <div class="tooldetail renderedFor" v-if="tool.toolDetail != ''" :class="{isUpdateToolDetailClass:toolDetailIndex == toolIndex}">
                       <!-- <div class="toolTitle">工具描述</div> -->
                         <!-- @click.stop="updateToolDetail(toolIndex, 2)" -->
                       <div style="height:100%;"
@@ -3848,7 +3868,7 @@
                       <div
                         v-for="(s, sIndex) in noWorksS[toolIndex]"
                         :key="sIndex"
-                        class="noWorksName"
+                        class="noWorksName2"
                         @click="teacherWorkSubmit(72, toolIndex, taskCount, s)"
                       >
                         <el-tooltip
@@ -4424,8 +4444,9 @@
                               word-break: break-word;
                               cursor: pointer;
                             "
+                            class="renderedFor"
                           >
-                              {{ index + 1 + "、"  }} <span v-html="renderedFormula(item.teststitle)"></span>
+                              {{ index + 1 + "、"  }} <span  v-html="renderedFormula(item.teststitle)"></span>
                           </div>
                         </el-tooltip>
                       </div>
@@ -9593,21 +9614,21 @@
             :key="index1"
           >
             <div class="a_add_head">
-              <div style="display: flex;align-items: center;">
+              <div style="display: flex;">
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (单选题)
                 </div>
                 <div
                   v-if="testJson.testJson[index1].type == '2'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (多选题)
                 </div>
-                  <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
+                  <div class="renderedFor"><span>题目:</span> <span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -9726,13 +9747,13 @@
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (单选题)
                 </div>
                 <div
                   v-if="testJson.testJson[index1].type == '2'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (多选题)
                 </div>
@@ -10055,7 +10076,9 @@
               @change="updateLookOpen"
             ></el-switch>
           </div>
-          <div class="switch_box" v-if="courseDetail.userid == userid">
+          <div class="switch_box" v-if="(courseDetail.userid == userid ||
+                (courseDetail.course_teacher &&
+                  courseDetail.course_teacher.indexOf(userid) != -1)) && !splitScreenData.isOpen">
             <span>开启跟随模式</span>
             <el-switch
               v-model="IsFollow"
@@ -12664,6 +12687,9 @@ export default {
   },
   data() {
     return {
+      // 学校或者组织随机码
+      Code2:'',
+      startTime: "",
       // 是否允许学生查看内容资料 2不可以 1可以
       IsStulook:false,
       homeWorkLoading:false,
@@ -12947,7 +12973,7 @@ export default {
       timer: null,
       timer2: null,
       opertimer: null,
-      showType: 0,
+      showType: '',
       fileType: 0,
       showPDF: false,
       noteName: "",
@@ -13046,9 +13072,31 @@ export default {
       confirmOpenDigData:'',
       canUseCourseId: ['bfbe1913-2f87-11ef-bf55-005056b86db5','3a64b199-d2eb-11ef-a2d1-005056b86db5', 'bb0b1995-0207-11ef-b534-005056b86db5', 'f77921c8-d2f1-11ef-a2d1-005056b86db5'],
       diffKey:"1",
+      getCourseGroupLoading: false,
+      selectSWorksLoading:false,
+      selectStudentLoading:false,
+      selectSLookLoading:false,
+      getPickLoading:false,
+      selectPzLoading:false,
+      getSplitScreenDataLoading:false,
     };
   },
   methods: {
+    // 获取学校或组织随机码
+    getCode2(){
+      let params = {
+        oid: this.oid,
+        org: this.org
+      };
+      this.ajax
+        .get(this.$store.state.api + "getCode2", params)
+        .then(res => {
+            this.Code2 = res.data[0][0].code2
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
     //查看应用中心作业
     openCocoFlow(w){
       this.$refs.cocoFlowDiaRef.openAppWork(w)
@@ -13384,6 +13432,12 @@ export default {
 					this.insertMemorandum(`选择<span class="variable">阶段${i+1}${this.navList[i].dyName?':'+this.navList[i].dyName:''}</span>→<span class="variable">任务${j+1}${this.navList[i].task[j].taskName?':'+this.navList[i].task[j].taskName:''}</span>→<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
 				}
       }
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) &&
+          this.IsFollow) {
+        this.setCTask();
+      }
 
       // var b = this.$refs["bz" + k][0];
       // a.scrollTop = b.offsetTop;
@@ -14510,6 +14564,8 @@ export default {
         });
     },
     selectStudent() {
+      if(this.selectStudentLoading) return
+      this.selectStudentLoading = true
       //学生查看自己作业
       let params = {
         uid: this.userid,
@@ -14832,8 +14888,12 @@ export default {
               }
             }
           }
+          this.selectStudentLoading = false
+
         })
         .catch((err) => {
+          this.selectStudentLoading = false
+
           console.error(err);
         });
     },
@@ -15192,6 +15252,8 @@ export default {
         .catch(() => {});
     },
     selectSWorks(gindex) {
+      if(this.selectSWorksLoading) return
+      this.selectSWorksLoading = true
       //教师查看全部作业
       let params = {
         cid: this.id,
@@ -15388,6 +15450,10 @@ export default {
                   }
                 } else if (data.type == 8 && a[i].tool[0] == 45) {
                   var checkL = JSON.parse(data.content)[0].anwer;
+                  if(a[i].testJson.testCount != JSON.parse(data.content)[0].testJson.testCount){
+                    continue
+                  }
+                  console.log('选择题')
                   for (var z = 0; z < checkL.length; z++) {
                     if (!this.checkJson[i][z]) {
                       this.checkJson[i].push({
@@ -16292,8 +16358,12 @@ export default {
               }, 0)
             })
           }
+          this.selectSWorksLoading = false
+
         })
         .catch((err) => {
+          this.selectSWorksLoading = false
+
           console.error(err);
         });
     },
@@ -17046,12 +17116,15 @@ export default {
       this.getHomeWork();
       this.getCourseDetail(2);
       this.$forceUpdate();
-      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
         this.setCTask();
       }
     },
 
     openTask(s, n, i,ctype) {
+      // 这段代码没用开启了跟随学生侧边栏会隐藏掉
       if (this.IsFollow && this.tType == 2) {
         this.$message.error("已经开启跟随模式,请认真跟堂听讲");
         return;
@@ -17164,7 +17237,9 @@ export default {
       this.selectPz();
       this.getHomeWork();
       this.getCourseDetail(2);
-      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
         this.setCTask();
       }
 			if(flag){
@@ -17296,7 +17371,11 @@ export default {
       this.ajax
         .get(this.$store.state.api + "selectCourseDetail3", params)
         .then((res) => {
-          this.addCourseState(1, JSON.parse(res.data[0][0].chapters));
+          if ((this.courseDetail.userid == this.userid ||
+              (this.courseDetail.course_teacher && 
+              this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
+            this.addCourseState(1, JSON.parse(res.data[0][0].chapters));
+          }
 
           if (type != 2) {
             loading.close();
@@ -17494,6 +17573,9 @@ export default {
                 } else if (_chapterData[this.taskCount][0].type == 16) {
                   this.showType = 16;
                   this.pptImgUrl1 = _url;
+                } else if (_chapterData[this.taskCount][0].type == 17) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -17663,6 +17745,9 @@ export default {
                 } else if (_chapterData[this.taskCount][0].type == 16) {
                   this.showType = 16;
                   this.pptImgUrl1 = _url;
+                } else if (_chapterData[this.taskCount][0].type == 17) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -17704,7 +17789,7 @@ export default {
             if (this.courseDetail.userid == this.userid) {
             
               // 开局关闭学生查看内容
-              this.StulookMode(false)
+              this.StulookMode(true)
               // 开局打开跟随模式
               this.followingMode(true)
             }
@@ -17772,6 +17857,11 @@ export default {
           }
           _this.$nextTick(function () {
             setTimeout(() => {
+              const element = document.getElementsByClassName("pb_body")[0];
+              if (element) {
+                  element.style.minHeight = 'unset'
+                  // 或者:element.style.removeProperty("min-height");
+              }
               // var a =
               //   document.getElementsByClassName("box_course")[0].offsetHeight;
               // document.getElementsByClassName("vedioList")[0].style.height =
@@ -17795,6 +17885,8 @@ export default {
         });
     },
     getCourseGroup(gindex) {
+      if(this.getCourseGroupLoading) return
+      this.getCourseGroupLoading = true
       let params = {
         cid: this.id,
         classid: this.tcid ? this.tcid : "1",
@@ -17844,8 +17936,12 @@ export default {
             this.selectSWorks(gindex);
             this.isGroup = false;
           }
+          this.getCourseGroupLoading = false
+
         })
         .catch((err) => {
+          this.getCourseGroupLoading = false
+
           // this.$message.error("网络不佳");
           console.error(err);
         });
@@ -18016,6 +18112,8 @@ export default {
       this.selectPz();
     },
     selectPz() {
+      if(this.selectPzLoading) return
+      this.selectPzLoading = true
       let params = {
         cid: this.id,
         s: this.courseType,
@@ -18038,8 +18136,12 @@ export default {
               }
             }
           }
+          this.selectPzLoading = false
+
         })
         .catch((err) => {
+          this.selectPzLoading = false
+
           console.error(err);
         });
     },
@@ -18193,6 +18295,8 @@ export default {
         });
     },
     selectSLook() {
+      if(this.selectSLookLoading) return
+      this.selectSLookLoading = true
       let params = {
         cid: this.id,
       };
@@ -18225,8 +18329,12 @@ export default {
               this.getCourseDetail(2);
             }
           }
+          this.selectSLookLoading = false
+
         })
         .catch((err) => {
+          this.selectSLookLoading = false
+
           console.error(err);
         });
     },
@@ -18353,6 +18461,7 @@ export default {
           state: JSON.stringify(_state),
         },
       ];
+      // 这两个接口是一样的type无所谓了
       this.ajax
         .post(
           this.$store.state.api +
@@ -19541,6 +19650,8 @@ export default {
 			this.insertMemorandum(`点击工作区<span class="variable">工具${index+1}:${this.toolsList[t]}</span>`)
     },
     teacherWorkSubmit(t, i, index, s) {
+      console.log('t',t);
+      if(t == 72) return
       this.sStudent = s;
       this.toolindex = i;
       this.sTool = t;
@@ -21009,6 +21120,8 @@ export default {
         });
     },
     getPick() {
+      if(this.getPickLoading) return
+      this.getPickLoading = true
       let params = {
         cid: this.id,
       };
@@ -21046,8 +21159,12 @@ export default {
               })
               .catch(() => {});
           }
+          this.getPickLoading = false
+
         })
         .catch((err) => {
+          this.getPickLoading = false
+
           this.$message.error("网络不佳");
           console.error(err);
         });
@@ -21234,6 +21351,8 @@ export default {
     getSplitScreenData() {
       // return;
       // if (this.tType != 1) return;
+      if(this.getSplitScreenDataLoading) return
+      this.getSplitScreenDataLoading = true
       let params = {
         cid: this.id
       };
@@ -21300,8 +21419,12 @@ export default {
                 .catch(() => {});
             }
           }
+          this.getSplitScreenDataLoading = false
+
         })
         .catch(e => {
+          this.getSplitScreenDataLoading = false
+
           console.log("获取分屏数出错:", e);
         });
     },
@@ -21569,6 +21692,22 @@ export default {
     clearInterval(this.opertimer);
     this.opertimer = null;
 		this.updateSplitScreenData(1);
+    if(this.courseDetail.userid == this.userid && this.org == '16ace517-b5c7-4168-a9bb-a9e0035df840'){
+      let endTime = new Date().toLocaleString("zh-CN", { 
+          hour12: false, 
+          timeZone: "Asia/Shanghai" 
+        }).replace(/\//g, "-")
+      let courseTime = Math.floor((new Date(endTime) - new Date(this.startTime)) / (1000 * 60))
+      this.syncClassData({
+        courseId: this.id,
+        title: this.courseDetail.title,
+        courseGrade: this.tcid2 ? this.tcid2 : '',
+        courseTime: courseTime,
+        startTime: this.startTime,
+        endTime: endTime,
+      })
+      console.log('同步数据')
+    }
   },
   computed: {
     renderedFormula2() {
@@ -21764,18 +21903,24 @@ export default {
 
   },
   mounted() {
-    if (this.tType == 1) {
-       // 开局关闭学生查看内容
-      this.StulookMode(false)
-      // 开局打开跟随模式
-      this.followingMode(true)
-    }
+    this.setoTime("1");
+    this.startTime = new Date().toLocaleString("zh-CN", { 
+      hour12: false, 
+      timeZone: "Asia/Shanghai" 
+    }).replace(/\//g, "-");
+
+    // if (this.tType == 1) {
+    //    // 开局关闭学生查看内容
+    //   this.StulookMode(false)
+    //   // 开局打开跟随模式
+    //   this.followingMode(true)
+    // }
     document.body.addEventListener("click", (e) => {
       if (this.isUpdateToolDetail1) {
         this.updateToolDetail(this.toolDetailIndex);
       }
     });
-
+    this.getCode2()
     this.setOperationTime();
     this.selectEva();
     this.getCourseDetail(10);
@@ -21807,15 +21952,15 @@ export default {
           a - 40 + "px";
       }
     });
-    let _this = this;
-    setTimeout(() => {
+    // let _this = this;
+    // setTimeout(() => {
       // _this.vedioTime = [];
       // for (var i = 0; i < _this.vedio[_this.taskCount].length; i++) {
       //   _this.vedioTime[i] = document.getElementsByClassName(
       //     "vjs-duration-display"
       //   )[i].textContent;
       // }
-    }, 1000);
+    // }, 1000);
     try{
       if (this.screenType == 2) {
         window.topU.postMessage({ allScreen: 4 }, "*");
@@ -23570,6 +23715,30 @@ export default {
   text-overflow: ellipsis;
   white-space: nowrap;
 }
+.noWorksName2 {
+  background: #fff;
+  color: #0061ff;
+  width: 90px;
+  height: 25px;
+  text-align: center;
+  line-height: 25px;
+  border-radius: 4px;
+  margin: 10px 15px 10px 0;
+  white-space: nowrap;
+  overflow: hidden;
+  padding: 5px;
+  text-overflow: ellipsis;
+  cursor: pointer;
+  border: 1px solid #0061ff;
+}
+
+.noWorksName2 > span {
+  max-width: 100%;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
 
 .isWorksName2 {
   width: 100px;
@@ -26287,18 +26456,23 @@ div::-webkit-scrollbar {
   overflow: hidden;
   text-overflow: ellipsis;
 }
-.pb_content >>> .katex {
-  font-size: 16px;
+
+.renderedFor >>> .katex {
+  font-size: 18px;
   width: 100%;
   white-space: normal;
+  font-family: '黑体' !important;
 }
-.pb_content >>> .katex .base{
+.renderedFor >>> .katex .base{
   display: inline !important;
   display: contents !important;
 }
 
-.pb_content >>> .katex .base .cjk_fallback{
+.renderedFor>>> .katex .base .cjk_fallback{
     white-space: normal !important;
     display: inline !important;
 }
+.notop >>> .vjs-fluid{
+  padding-top: 0 !important;
+}
 </style>

+ 1 - 1
src/components/studyStudentJiu.vue

@@ -73,7 +73,7 @@
             style="padding: 0 0 8px 0"
           >
             <div>
-              <span>随机码:{{ inviteCode }}</span>
+              <span>识别码:{{ inviteCode }}</span>
             </div>
           </div>
         </div>

+ 189 - 40
src/components/studySutdentClass/studyStudent.vue

@@ -103,7 +103,8 @@
             style="padding: 0 0 8px 0"
           >
             <div>
-              <span>随机码:{{ inviteCode }}</span>
+              <span>识别码:{{ Code2 ? Code2 + inviteCode : inviteCode }}</span>
+              <!-- <span>识别码:{{ inviteCode }}</span> -->
             </div>
           </div>
         </div>
@@ -521,6 +522,7 @@
                   flex-direction: column;
                   position: relative;
                 "
+                class="renderedFor"
               >
                 <div
                   style="
@@ -529,7 +531,7 @@
                     font-size: 18px;
                     color: #0e1e33;
                   "
-                  class="cont"
+                   class="cont"
                   v-if="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail != ''
@@ -568,12 +570,12 @@
                       style="height: 650px; width: calc(100% - 50px)"
                     >
                       <video-player
-                        class="video-player vjs-custom-skin"
+                        class="video-player vjs-custom-skin notop"
                         :class="contentDialog == false ? 'isAllWidth' : ''"
                         :playsinline="true"
                         :options="playerO[0]"
                         @play="onPlayerPlay($event)"
-                        style="width: 100%; height: 100%; margin: 0 0 0 30px"
+                        style="width: 100%; height: 650px; margin: 0 0 0 30px"
                       ></video-player>
                     </div>
                   </div>
@@ -729,12 +731,12 @@
                               <span v-if="vitem.text">{{ vitem.text }}-</span
                               >{{ vitem.name }}
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 6">
                             <div
@@ -793,12 +795,12 @@
                                 alt
                               />
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 12">
                             <div class="navText" @click="downloadFile2(vitem)">
@@ -814,12 +816,12 @@
                                 alt
                               />
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 13">
                             <div
@@ -829,12 +831,12 @@
                             >
                               {{ vitem.name }}
                             </div>
-                            <div class="downIcon" @click="downloadFile2(vitem)">
+                            <!-- <div class="downIcon" @click="downloadFile2(vitem)">
                               <img
                                 src="../../assets/icon/newIcon/down.png"
                                 alt
                               />
-                            </div>
+                            </div> -->
                           </div>
                           <div class="navListItem" v-if="vitem.type == 16">
                             <div
@@ -854,6 +856,24 @@
                               />
                             </div>
                           </div>
+                          <div class="navListItem" v-if="vitem.type == 17">
+                            <div
+                              class="navText"
+                              @click="checkHtml(vitem, vindex)"
+                              :class="isClickNav == vindex ? 'isClickNav' : ''"
+                            >
+                              {{ vitem.name }}
+                            </div>
+                            <div
+                              class="downIcon"
+                              @click="checkFileFull1(vitem.type, vitem)"
+                            >
+                              <img
+                                src="../../assets/icon/newIcon/allScreen.png"
+                                alt
+                              />
+                            </div>
+                          </div>
                         </div>
                         <div class="fileC_box" v-if="fileC[0].length > 0">
                           <div class="fileC_title">以下文件不支持预览</div>
@@ -867,7 +887,7 @@
                                 <span v-if="vitem.text">{{ vitem.text }}-</span
                                 >{{ vitem.name }}
                               </div>
-                              <div
+                              <!-- <div
                                 class="downIcon"
                                 @click="downloadFile2(vitem)"
                               >
@@ -875,7 +895,7 @@
                                   src="../../assets/icon/newIcon/down.png"
                                   alt
                                 />
-                              </div>
+                              </div> -->
                             </div>
                           </div>
                         </div>
@@ -1563,7 +1583,7 @@
                       </div>
                     </div>
                     <div
-                      class="tooldetail"
+                      class="tooldetail renderedFor"
                       v-if="tool.toolDetail != ''"
                       :class="{
                         isUpdateToolDetailClass: toolDetailIndex == toolIndex
@@ -5173,7 +5193,7 @@
                       <div
                         v-for="(s, sIndex) in noWorksS[toolIndex]"
                         :key="sIndex"
-                        class="noWorksName"
+                        class="noWorksName2"
                         @click="teacherWorkSubmit(72, toolIndex, taskCount, s)"
                       >
                         <el-tooltip
@@ -6201,6 +6221,7 @@
                               word-break: break-word;
                               cursor: pointer;
                             "
+                            class="renderedFor"
                           >
                             {{ index + 1 + "、"  }} <span v-html="renderedFormula(item.teststitle)"></span>
                           </div>
@@ -12838,21 +12859,21 @@
             :key="index1"
           >
             <div class="a_add_head">
-              <div style="display: flex;align-items: center;">
+              <div style="display: flex;">
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (单选题)
                 </div>
                 <div
                   v-if="testJson.testJson[index1].type == '2'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (多选题)
                 </div>
-                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
+                <div class="renderedFor">题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -12971,13 +12992,13 @@
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (单选题)
                 </div>
                 <div
                   v-if="testJson.testJson[index1].type == '2'"
-                  style="margin-right: 5px; min-width: 70px"
+                  style="margin-right: 5px; min-width: 70px;flex-shrink: 0;"
                 >
                   (多选题)
                 </div>
@@ -13300,7 +13321,9 @@
               @change="updateLookOpen"
             ></el-switch>
           </div>
-          <div class="switch_box" v-if="courseDetail.userid == userid">
+          <div class="switch_box" v-if=" (courseDetail.userid == userid ||
+              (courseDetail.course_teacher &&
+                courseDetail.course_teacher.indexOf(userid) != -1)) && !splitScreenData.isOpen">
             <span>开启跟随模式</span>
             <el-switch
               v-model="IsFollow"
@@ -15978,6 +16001,8 @@ export default {
   },
   data() {
     return {
+      // 学校或者组织随机码
+      Code2:'',
       // 是否允许学生查看内容资料 2不可以 1可以
       IsStulook:false,
       homeWorkLoading:false,
@@ -16379,7 +16404,14 @@ export default {
       languageSetting: 0, //0中文 1繁体 2英文
       toolListS: [],
       commentDetailCopy: "",
-      diffKey:"1"
+      diffKey:"1",
+      getCourseGroupLoading: false,
+      selectSWorksLoading:false,
+      selectStudentLoading:false,
+      selectSLookLoading:false,
+      getPickLoading:false,
+      selectPzLoading:false,
+      getSplitScreenDataLoading:false,
     };
   },
   watch:{
@@ -16401,11 +16433,11 @@ export default {
     },
     worksStudent: {
       handler(newVal, oldVal) {
-          const sum1 = newVal.reduce((total, subArr) => total + subArr.length, 0);
-          const sum2 = oldVal.reduce((total, subArr) => total + subArr.length, 0);
+          // const sum1 = newVal.reduce((total, subArr) => total + subArr.length, 0);
+          // const sum2 = oldVal.reduce((total, subArr) => total + subArr.length, 0);
           // console.log('worksStudent',sum1,sum2);
           
-          if(sum1 != sum2){
+          if(JSON.stringify(newVal) !=  JSON.stringify(oldVal)){
               this.AIloading = [];
               this.loopLoading = [];
 
@@ -16425,6 +16457,21 @@ export default {
     }
   },
   methods: {
+    // 获取学校或组织随机码
+    getCode2(){
+      let params = {
+        oid: this.oid,
+        org: this.org
+      };
+      this.ajax
+        .get(this.$store.state.api + "getCode2", params)
+        .then(res => {
+            this.Code2 = res.data[0][0].code2
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
     //查看应用中心作业
     openCocoFlow(w){
       this.$refs.cocoFlowDiaRef.openAppWork(w)
@@ -17388,7 +17435,12 @@ export default {
 					this.insertMemorandum(`选择<span class="variable">阶段${i+1}${this.navList[i].dyName?':'+this.navList[i].dyName:''}</span>→<span class="variable">任务${j+1}${this.navList[i].task[j].taskName?':'+this.navList[i].task[j].taskName:''}</span>→<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
 				}
       }
-
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) &&
+          this.IsFollow) {
+        this.setCTask();
+      }
       // var b = this.$refs["bz" + k][0];
       // a.scrollTop = b.offsetTop;
     },
@@ -18537,6 +18589,8 @@ export default {
         });
     },
     selectStudent() {
+      if(this.selectStudentLoading) return
+      this.selectStudentLoading = true
       //学生查看自己作业
       let params = {
         uid: this.userid,
@@ -18859,8 +18913,12 @@ export default {
               }
             }
           }
+          this.selectStudentLoading = false
+
         })
         .catch((err) => {
+          this.selectStudentLoading = false
+
           console.error(err);
         });
     },
@@ -19230,6 +19288,8 @@ export default {
       return lang;
     },
     selectSWorks(gindex) {
+      if(this.selectSWorksLoading) return
+      this.selectSWorksLoading = true
       //教师查看全部作业
       let params = {
         cid: this.id,
@@ -19436,6 +19496,10 @@ export default {
                   }
                 } else if (data.type == 8 && a[i].tool[0] == 45) {
                   var checkL = JSON.parse(data.content)[0].anwer;
+                  if(a[i].testJson.testCount != JSON.parse(data.content)[0].testJson.testCount){
+                    continue
+                  }
+                  console.log('选择题')
                   for (var z = 0; z < checkL.length; z++) {
                     if (!this.checkJson[i][z]) {
                       this.checkJson[i].push({
@@ -20341,8 +20405,12 @@ export default {
               }, 0);
             });
           }
+          this.selectSWorksLoading = false
+
         })
         .catch(err => {
+          this.selectSWorksLoading = false
+
           console.error(err);
         });
     },
@@ -21096,7 +21164,9 @@ export default {
       this.getHomeWork();
       this.getCourseDetail(2);
       this.$forceUpdate();
-      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
         this.setCTask();
       }
     },
@@ -21213,7 +21283,9 @@ export default {
 			}else{
 				this.insertMemorandum(`进入<span class="variable">阶段${s+1}${this.navList[s].dyName?':'+this.navList[s].dyName:''}</span>→<span class="variable">任务${n+1}${this.navList[s].task[n].taskName?':'+this.navList[s].task[n].taskName:''}</span>`)
 			}
-      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+      if ((this.courseDetail.userid == this.userid ||
+          (this.courseDetail.course_teacher && 
+          this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
         this.setCTask();
       }
     },
@@ -21338,8 +21410,11 @@ export default {
       this.ajax
         .get(this.$store.state.api + "selectCourseDetail3", params)
         .then((res) => {
-          this.addCourseState(1, JSON.parse(res.data[0][0].chapters));
-
+          if ((this.courseDetail.userid == this.userid ||
+              (this.courseDetail.course_teacher && 
+              this.courseDetail.course_teacher.indexOf(this.userid) != -1)) && this.IsFollow) {
+            this.addCourseState(1, JSON.parse(res.data[0][0].chapters));
+          }
           if (type != 2) {
             loading.close();
             if (
@@ -21537,6 +21612,9 @@ export default {
                 } else if (_chapterData[taskCount][0].type == 16) {
                   this.showType = 16;
                   this.pptImgUrl1 = _url;
+                } else if (_chapterData[taskCount][0].type == 17) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -21707,6 +21785,9 @@ export default {
                 } else if (_chapterData[taskCount][0].type == 16) {
                   this.showType = 16;
                   this.pptImgUrl1 = _url;
+                } else if (_chapterData[taskCount][0].type == 17) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -21812,7 +21893,7 @@ export default {
             if (this.courseDetail.userid == this.userid) {
             
               // 开局关闭学生查看内容
-              this.StulookMode(false)
+              this.StulookMode(true)
               // 开局打开跟随模式
               this.followingMode(true)
             }
@@ -21891,6 +21972,11 @@ export default {
 
           _this.$nextTick(function () {
             setTimeout(() => {
+              const element = document.getElementsByClassName("pb_body")[0];
+              if (element) {
+                  element.style.minHeight = 'unset'
+                  // 或者:element.style.removeProperty("min-height");
+              }
               // var a =
               //   document.getElementsByClassName("box_course")[0].offsetHeight;
               // document.getElementsByClassName("vedioList")[0].style.height =
@@ -21914,6 +22000,8 @@ export default {
         });
     },
     getCourseGroup(gindex) {
+      if(this.getCourseGroupLoading) return
+      this.getCourseGroupLoading = true
       let params = {
         cid: this.id,
         classid: this.tcid ? this.tcid : "1",
@@ -21963,8 +22051,12 @@ export default {
             this.selectSWorks(gindex);
             this.isGroup = false;
           }
+          this.getCourseGroupLoading = false
+
         })
         .catch((err) => {
+          this.getCourseGroupLoading = false
+
           // this.$message.error("网络不佳");
           console.error(err);
         });
@@ -22134,6 +22226,8 @@ export default {
       this.selectPz();
     },
     selectPz() {
+      if(this.selectPzLoading) return
+      this.selectPzLoading = true
       let params = {
         cid: this.id,
         s: this.courseType,
@@ -22156,8 +22250,12 @@ export default {
               }
             }
           }
+          this.selectPzLoading = false
+
         })
         .catch((err) => {
+          this.selectPzLoading = false
+
           console.error(err);
         });
     },
@@ -22311,6 +22409,8 @@ export default {
         });
     },
     selectSLook() {
+      if(this.selectSLookLoading) return
+      this.selectSLookLoading = true
       let params = {
         cid: this.id,
       };
@@ -22343,8 +22443,12 @@ export default {
               this.getCourseDetail(2);
             }
           }
+          this.selectSLookLoading = false
+
         })
         .catch((err) => {
+          this.selectSLookLoading = false
+
           console.error(err);
         });
     },
@@ -23659,6 +23763,8 @@ export default {
 			this.insertMemorandum(`点击工作区<span class="variable">工具${index+1}:${this.toolsList[t]}</span>`)
     },
     teacherWorkSubmit(t, i, index, s) {
+      console.log('t',t);
+      if(t == 72) return
       this.sStudent = s;
       this.toolindex = i;
       this.sTool = t;
@@ -25134,6 +25240,9 @@ export default {
         });
     },
     getPick() {
+      if(this.getPickLoading) return
+      this.getPickLoading = true
+
       let params = {
         cid: this.id,
       };
@@ -25171,8 +25280,12 @@ export default {
               })
               .catch(() => {});
           }
+          this.getPickLoading = false
+
         })
         .catch((err) => {
+          this.getPickLoading = false
+
           this.$message.error("网络不佳");
           console.error(err);
         });
@@ -25359,6 +25472,8 @@ export default {
     getSplitScreenData() {
       // return;
       // if (this.tType != 1) return;
+      if(this.getSplitScreenDataLoading) return
+      this.getSplitScreenDataLoading = true
       let params = {
         cid: this.id
       };
@@ -25425,8 +25540,12 @@ export default {
                 .catch(() => {});
             }
           }
+          this.getSplitScreenDataLoading = false
+
         })
         .catch(e => {
+          this.getSplitScreenDataLoading = false
+
           console.log("获取分屏数出错:", e);
         });
     },
@@ -25906,6 +26025,8 @@ export default {
     } catch (error) {
       console.log(error)
     }
+    this.getCode2()
+
     this.setOperationTime();
     this.selectEva();
     this.getCourseDetail(10);
@@ -25935,15 +26056,15 @@ export default {
           a - 40 + "px";
       }
     });
-    let _this = this;
-    setTimeout(() => {
+    // let _this = this;
+    // setTimeout(() => {
       // _this.vedioTime = [];
       // for (var i = 0; i < _this.vedio[_this.taskCount].length; i++) {
       //   _this.vedioTime[i] = document.getElementsByClassName(
       //     "vjs-duration-display"
       //   )[i].textContent;
       // }
-    }, 1000);
+    // }, 1000);
   },
 };
 </script>
@@ -27703,6 +27824,30 @@ export default {
   text-overflow: ellipsis;
   white-space: nowrap;
 }
+.noWorksName2 {
+  background: #fff;
+  color: #0061ff;
+  width: 90px;
+  height: 25px;
+  text-align: center;
+  line-height: 25px;
+  border-radius: 4px;
+  margin: 10px 15px 10px 0;
+  white-space: nowrap;
+  overflow: hidden;
+  padding: 5px;
+  text-overflow: ellipsis;
+  cursor: pointer;
+  border: 1px solid #0061ff;
+}
+
+.noWorksName2 > span {
+  max-width: 100%;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
 
 .isWorksName2 {
   width: 100px;
@@ -30423,18 +30568,22 @@ div::-webkit-scrollbar {
 
   text-overflow: ellipsis;
 }
-.pb_content >>> .katex {
-  font-size: 16px;
+.renderedFor >>> .katex {
+  font-size: 18px;
   width: 100%;
   white-space: normal;
+  font-family: '黑体' !important;
 }
-.pb_content >>> .katex .base{
+.renderedFor >>> .katex .base{
   display: inline !important;
   display: contents !important;
 }
 
-.pb_content >>> .katex .base .cjk_fallback{
+.renderedFor>>> .katex .base .cjk_fallback{
     white-space: normal !important;
     display: inline !important;
 }
+.notop >>> .vjs-fluid{
+  padding-top: 0 !important;
+}
 </style>

+ 2 - 3
src/components/trainCourse/courseDetail.vue

@@ -168,19 +168,18 @@
                     }}
                   </div>
                 </div>
-                <div class="now_study" @click="exportCourse" v-if="tType != 2">
+                <!-- <div class="now_study" @click="exportCourse" v-if="tType != 2">
                   <div class="returnIndexImg">
                     <img src="../../assets/icon/newIcon/CourseInfo.png" alt="" />
                   </div>
                   <div>导出信息</div>
                 </div>
-                <!--  -->
                 <div class="now_study" @click="uploadCourse" v-if="tType != 2">
                   <div class="returnIndexImg">
                     <img src="../../assets/icon/newIcon/uploadCourse.png" alt="" />
                   </div>
                   <div>导出文件</div>
-                </div>
+                </div> -->
                 <!-- <div
                   class="now_group"
                   v-if="groupInfo && courseDetail.state == 1"

+ 1 - 1
src/components/trainCourse/easy2/studyStudent.vue

@@ -102,7 +102,7 @@
             style="padding: 0 0 8px 0"
           >
             <div>
-              <span>随机码:{{ inviteCode }}</span>
+              <span>识别码:{{ inviteCode }}</span>
             </div>
           </div>
         </div>

+ 1 - 1
src/components/trainCourse/easy3/studyStudent.vue

@@ -102,7 +102,7 @@
             style="padding: 0 0 8px 0"
           >
             <div>
-              <span>随机码:{{ inviteCode }}</span>
+              <span>识别码:{{ inviteCode }}</span>
             </div>
           </div>
         </div>

+ 1 - 1
src/components/trainCourse/studyStudent.vue

@@ -73,7 +73,7 @@
             style="padding: 0 0 8px 0"
           >
             <div>
-              <span>随机码:{{ inviteCode }}</span>
+              <span>识别码:{{ inviteCode }}</span>
             </div>
           </div>
         </div>

+ 142 - 1
src/lang/cn.json

@@ -1,3 +1,144 @@
 {
-  "lang": "cn"
+  "lang": "cn",
+  "study_student_一键重置_0": "一键重置",
+  "study_student_上一步_1": "上一步",
+  "study_student_上传作业_2": "上传作业",
+  "study_student_上传文件_3": "上传文件",
+  "study_student_下一步_4": "下一步",
+  "study_student_下载_5": "下载",
+  "study_student_个人评价_6": "个人评价",
+  "study_student_交互视频_7": "交互视频",
+  "study_student_人_8": "人",
+  "study_student_以下文件不支持预览_9": "以下文件不支持预览",
+  "study_student_任务_10": "任务",
+  "study_student_位置已满_11": "位置已满",
+  "study_student_位置已被锁定_12": "位置已被锁定",
+  "study_student_作业提交_13": "作业提交",
+  "study_student_作业提交工具_14": "作业提交工具",
+  "study_student_作业预览_15": "作业预览",
+  "study_student_你确定提交批改嘛_16": "你确定提交批改嘛",
+  "study_student_你被老师选到啦_17": "你被老师选到啦",
+  "study_student_便签_18": "便签",
+  "study_student_修改分屏数据失败_19": "修改分屏数据失败",
+  "study_student_修改分屏数据成功_20": "修改分屏数据成功",
+  "study_student_修改成功_21": "修改成功",
+  "study_student_倒计时_22": "倒计时",
+  "study_student_全历史_23": "全历史",
+  "study_student_公式编辑_24": "公式编辑",
+  "study_student_内容列表_25": "内容列表",
+  "study_student_分_26": "分",
+  "study_student_分子结构_27": "分子结构",
+  "study_student_分屏开启失败_28": "分屏开启失败",
+  "study_student_分屏模式已开启_29": "分屏模式已开启",
+  "study_student_分析_30": "分析",
+  "study_student_分组设置_31": "分组设置",
+  "study_student_刷新_32": "刷新",
+  "study_student_加入成功_33": "加入成功",
+  "study_student_协同文档_34": "协同文档",
+  "study_student_取消_35": "取消",
+  "study_student_同学回答问题_36": "同学回答问题",
+  "study_student_学习资料_37": "学习资料",
+  "study_student_学生分组_38": "学生分组",
+  "study_student_导出作业_39": "导出作业",
+  "study_student_展开_40": "展开",
+  "study_student_展开目标_41": "展开目标",
+  "study_student_工作区_42": "工作区",
+  "study_student_工具_43": "工具",
+  "study_student_已关闭分屏模式_44": "已关闭分屏模式",
+  "study_student_已开启分屏_45": "已开启分屏",
+  "study_student_已点击允许_46": "已点击允许",
+  "study_student_已经有小组比你设置的人数多_47": "已经有小组比你设置的人数多",
+  "study_student_已结束分屏模式_48": "已结束分屏模式",
+  "study_student_应用中心_49": "应用中心",
+  "study_student_开启成功_50": "开启成功",
+  "study_student_录制_51": "录制",
+  "study_student_录屏_52": "录屏",
+  "study_student_思维导图_53": "思维导图",
+  "study_student_思维网格_54": "思维网格",
+  "study_student_打开链接_55": "打开链接",
+  "study_student_批量上传_56": "批量上传",
+  "study_student_折叠_57": "折叠",
+  "study_student_挑人_58": "挑人",
+  "study_student_排序_59": "排序",
+  "study_student_提交成功_60": "提交成功",
+  "study_student_提示_61": "提示",
+  "study_student_操作成功_62": "操作成功",
+  "study_student_操作过快_63": "操作过快",
+  "study_student_收缩_64": "收缩",
+  "study_student_收起目标_65": "收起目标",
+  "study_student_教师已结束分屏_66": "教师已结束分屏",
+  "study_student_数字画板_67": "数字画板",
+  "study_student_数学画板_68": "数学画板",
+  "study_student_文件加载中_69": "文件加载中",
+  "study_student_文档_70": "文档",
+  "study_student_无法加入_71": "无法加入",
+  "study_student_无法退出_72": "无法退出",
+  "study_student_时间_73": "时间",
+  "study_student_时间轴_74": "时间轴",
+  "study_student_是否让_75": "是否让",
+  "study_student_智能体_76": "智能体",
+  "study_student_暂无描述_77": "暂无描述",
+  "study_student_暂无提交作业_78": "暂无提交作业",
+  "study_student_未提交_79": "未提交",
+  "study_student_权限_80": "权限",
+  "study_student_查看_81": "查看",
+  "study_student_查看文档_82": "查看文档",
+  "study_student_模拟驾驶_83": "模拟驾驶",
+  "study_student_正在评分_84": "正在评分",
+  "study_student_正确率_85": "正确率",
+  "study_student_汉字宫_86": "汉字宫",
+  "study_student_流停止监听_87": "流停止监听",
+  "study_student_海龟编程_88": "海龟编程",
+  "study_student_深度学习_89": "深度学习",
+  "study_student_渲染失败_90": "渲染失败",
+  "study_student_渲染错误_91": "渲染错误",
+  "study_student_源码编辑_92": "源码编辑",
+  "study_student_点_93": "点",
+  "study_student_生成词云_94": "生成词云",
+  "study_student_电子白板_95": "电子白板",
+  "study_student_的数字_96": "的数字",
+  "study_student_目前人数_97": "目前人数",
+  "study_student_目标_98": "目标",
+  "study_student_目标树_99": "目标树",
+  "study_student_目标管理_100": "目标管理",
+  "study_student_目标罗盘_101": "目标罗盘",
+  "study_student_确定_102": "确定",
+  "study_student_确定后自由预览_103": "确定后自由预览",
+  "study_student_确定导出作业吗_104": "确定导出作业吗",
+  "study_student_答对人数_105": "答对人数",
+  "study_student_素材库_106": "素材库",
+  "study_student_细则_107": "细则",
+  "study_student_统计分析_108": "统计分析",
+  "study_student_维度描述_109": "维度描述",
+  "study_student_网络不佳_110": "网络不佳",
+  "study_student_翻译_111": "翻译",
+  "study_student_英语写作_112": "英语写作",
+  "study_student_英语口语_113": "英语口语",
+  "study_student_获取了分屏数_114": "获取了分屏数",
+  "study_student_获取分屏数出错_115": "获取分屏数出错",
+  "study_student_表格_116": "表格",
+  "study_student_训练平台_117": "训练平台",
+  "study_student_训练服务器_118": "训练服务器",
+  "study_student_设置成功_119": "设置成功",
+  "study_student_评一评_120": "评一评",
+  "study_student_评价标准_121": "评价标准",
+  "study_student_评价维度_122": "评价维度",
+  "study_student_评分_123": "评分",
+  "study_student_评分中_124": "评分中",
+  "study_student_评论_125": "评论",
+  "study_student_请检查是否存在麦克风_126": "请检查是否存在麦克风",
+  "study_student_请稍等_127": "请稍等",
+  "study_student_请输入_128": "请输入",
+  "study_student_请输入任务描述_129": "请输入任务描述",
+  "study_student_请重新设置_130": "请重新设置",
+  "study_student_课程设计_131": "课程设计",
+  "study_student_路径搜索_132": "路径搜索",
+  "study_student_返回_133": "返回",
+  "study_student_退出成功_134": "退出成功",
+  "study_student_选择匹配_135": "选择匹配",
+  "study_student_选择题_136": "选择题",
+  "study_student_问卷调查_137": "问卷调查",
+  "study_student_问答_138": "问答",
+  "study_student_随机码_139": "随机码",
+  "study_student_魔盒识字_140": "魔盒识字"
 }

+ 142 - 1
src/lang/en.json

@@ -1,3 +1,144 @@
 {
-  "lang": "com"
+  "lang": "com",
+  "study_student_一键重置_0": "One-click Reset",
+  "study_student_上一步_1": "Previous",
+  "study_student_上传作业_2": "Upload Homework",
+  "study_student_上传文件_3": "Upload File",
+  "study_student_下一步_4": "Next",
+  "study_student_下载_5": "Download",
+  "study_student_个人评价_6": "Personal Evaluation",
+  "study_student_交互视频_7": "Interactive Video",
+  "study_student_人_8": "Person",
+  "study_student_以下文件不支持预览_9": "The following files do not support preview",
+  "study_student_任务_10": "Task",
+  "study_student_位置已满_11": "Position Full",
+  "study_student_位置已被锁定_12": "Position Locked",
+  "study_student_作业提交_13": "Homework Submission",
+  "study_student_作业提交工具_14": "Homework Submission Tool",
+  "study_student_作业预览_15": "Homework Preview",
+  "study_student_你确定提交批改嘛_16": "Are you sure to submit for grading?",
+  "study_student_你被老师选到啦_17": "You have been selected by the teacher",
+  "study_student_便签_18": "Note",
+  "study_student_修改分屏数据失败_19": "Failed to modify split screen data",
+  "study_student_修改分屏数据成功_20": "Successfully modified split screen data",
+  "study_student_修改成功_21": "Modified Successfully",
+  "study_student_倒计时_22": "Countdown",
+  "study_student_全历史_23": "All History",
+  "study_student_公式编辑_24": "Formula Editor",
+  "study_student_内容列表_25": "Content List",
+  "study_student_分_26": "Points",
+  "study_student_分子结构_27": "Molecular Structure",
+  "study_student_分屏开启失败_28": "Failed to enable split screen",
+  "study_student_分屏模式已开启_29": "Split screen mode enabled",
+  "study_student_分析_30": "Analysis",
+  "study_student_分组设置_31": "Group Settings",
+  "study_student_刷新_32": "Refresh",
+  "study_student_加入成功_33": "Joined Successfully",
+  "study_student_协同文档_34": "Collaborative Document",
+  "study_student_取消_35": "Cancel",
+  "study_student_同学回答问题_36": "Classmate Answered",
+  "study_student_学习资料_37": "Learning Materials",
+  "study_student_学生分组_38": "Student Grouping",
+  "study_student_导出作业_39": "Export Homework",
+  "study_student_展开_40": "Expand",
+  "study_student_展开目标_41": "Expand Goal",
+  "study_student_工作区_42": "Workspace",
+  "study_student_工具_43": "Tool",
+  "study_student_已关闭分屏模式_44": "Split screen mode closed",
+  "study_student_已开启分屏_45": "Split screen enabled",
+  "study_student_已点击允许_46": "Allowed",
+  "study_student_已经有小组比你设置的人数多_47": "There is already a group with more members than you set",
+  "study_student_已结束分屏模式_48": "Split screen mode ended",
+  "study_student_应用中心_49": "Application Center",
+  "study_student_开启成功_50": "Enabled Successfully",
+  "study_student_录制_51": "Record",
+  "study_student_录屏_52": "Screen Recording",
+  "study_student_思维导图_53": "Mind Map",
+  "study_student_思维网格_54": "Thinking Grid",
+  "study_student_打开链接_55": "Open Link",
+  "study_student_批量上传_56": "Batch Upload",
+  "study_student_折叠_57": "Collapse",
+  "study_student_挑人_58": "Pick Person",
+  "study_student_排序_59": "Sort",
+  "study_student_提交成功_60": "Submitted Successfully",
+  "study_student_提示_61": "Tip",
+  "study_student_操作成功_62": "Operation Successful",
+  "study_student_操作过快_63": "Operation Too Fast",
+  "study_student_收缩_64": "Collapse",
+  "study_student_收起目标_65": "Collapse Goal",
+  "study_student_教师已结束分屏_66": "Teacher has ended split screen",
+  "study_student_数字画板_67": "Digital Canvas",
+  "study_student_数学画板_68": "Math Canvas",
+  "study_student_文件加载中_69": "File Loading",
+  "study_student_文档_70": "Document",
+  "study_student_无法加入_71": "Unable to Join",
+  "study_student_无法退出_72": "Unable to Exit",
+  "study_student_时间_73": "Time",
+  "study_student_时间轴_74": "Timeline",
+  "study_student_是否让_75": "Whether to let",
+  "study_student_智能体_76": "Agent",
+  "study_student_暂无描述_77": "No Description",
+  "study_student_暂无提交作业_78": "No Homework Submitted",
+  "study_student_未提交_79": "Not Submitted",
+  "study_student_权限_80": "Permission",
+  "study_student_查看_81": "View",
+  "study_student_查看文档_82": "View Document",
+  "study_student_模拟驾驶_83": "Simulated Driving",
+  "study_student_正在评分_84": "Scoring",
+  "study_student_正确率_85": "Accuracy Rate",
+  "study_student_汉字宫_86": "Chinese Character Palace",
+  "study_student_流停止监听_87": "Stream stopped listening",
+  "study_student_海龟编程_88": "Turtle Programming",
+  "study_student_深度学习_89": "Deep Learning",
+  "study_student_渲染失败_90": "Rendering Failed",
+  "study_student_渲染错误_91": "Rendering Error",
+  "study_student_源码编辑_92": "Source Code Editor",
+  "study_student_点_93": "Point",
+  "study_student_生成词云_94": "Generate Word Cloud",
+  "study_student_电子白板_95": "Electronic Whiteboard",
+  "study_student_的数字_96": " of numbers",
+  "study_student_目前人数_97": "Current Number of People",
+  "study_student_目标_98": "Goal",
+  "study_student_目标树_99": "Goal Tree",
+  "study_student_目标管理_100": "Goal Management",
+  "study_student_目标罗盘_101": "Goal Compass",
+  "study_student_确定_102": "Confirm",
+  "study_student_确定后自由预览_103": "Free preview after confirmation",
+  "study_student_确定导出作业吗_104": "Are you sure to export homework?",
+  "study_student_答对人数_105": "Number of Correct Answers",
+  "study_student_素材库_106": "Material Library",
+  "study_student_细则_107": "Details",
+  "study_student_统计分析_108": "Statistical Analysis",
+  "study_student_维度描述_109": "Dimension Description",
+  "study_student_网络不佳_110": "Poor Network",
+  "study_student_翻译_111": "Translate",
+  "study_student_英语写作_112": "English Writing",
+  "study_student_英语口语_113": "English Speaking",
+  "study_student_获取了分屏数_114": "Got split screen count",
+  "study_student_获取分屏数出错_115": "Error getting split screen count",
+  "study_student_表格_116": "Table",
+  "study_student_训练平台_117": "Training Platform",
+  "study_student_训练服务器_118": "Training Server",
+  "study_student_设置成功_119": "Settings Saved",
+  "study_student_评一评_120": "Rate",
+  "study_student_评价标准_121": "Evaluation Criteria",
+  "study_student_评价维度_122": "Evaluation Dimension",
+  "study_student_评分_123": "Score",
+  "study_student_评分中_124": "Scoring",
+  "study_student_评论_125": "Comment",
+  "study_student_请检查是否存在麦克风_126": "Please check if microphone exists",
+  "study_student_请稍等_127": "Please Wait",
+  "study_student_请输入_128": "Please Enter",
+  "study_student_请输入任务描述_129": "Please enter task description",
+  "study_student_请重新设置_130": "Please Reset",
+  "study_student_课程设计_131": "Course Design",
+  "study_student_路径搜索_132": "Path Search",
+  "study_student_返回_133": "Return",
+  "study_student_退出成功_134": "Exited Successfully",
+  "study_student_选择匹配_135": "Select Match",
+  "study_student_选择题_136": "Multiple Choice",
+  "study_student_问卷调查_137": "Questionnaire",
+  "study_student_问答_138": "Q&A",
+  "study_student_随机码_139": "Random Code",
+  "study_student_魔盒识字_140": "Magic Box Literacy"
 }

+ 142 - 1
src/lang/hk.json

@@ -1,3 +1,144 @@
 {
-  "lang": "hk"
+  "lang": "hk",
+  "study_student_一键重置_0": "一鍵重置",
+  "study_student_上一步_1": "上一步",
+  "study_student_上传作业_2": "上傳作業",
+  "study_student_上传文件_3": "上傳文件",
+  "study_student_下一步_4": "下一步",
+  "study_student_下载_5": "下載",
+  "study_student_个人评价_6": "個人評價",
+  "study_student_交互视频_7": "交互視頻",
+  "study_student_人_8": "人",
+  "study_student_以下文件不支持预览_9": "以下文件不支持預覽",
+  "study_student_任务_10": "任務",
+  "study_student_位置已满_11": "位置已滿",
+  "study_student_位置已被锁定_12": "位置已被鎖定",
+  "study_student_作业提交_13": "作業提交",
+  "study_student_作业提交工具_14": "作業提交工具",
+  "study_student_作业预览_15": "作業預覽",
+  "study_student_你确定提交批改嘛_16": "你確定提交批改嘛",
+  "study_student_你被老师选到啦_17": "你被老師選到啦",
+  "study_student_便签_18": "便簽",
+  "study_student_修改分屏数据失败_19": "修改分屏數據失敗",
+  "study_student_修改分屏数据成功_20": "修改分屏數據成功",
+  "study_student_修改成功_21": "修改成功",
+  "study_student_倒计时_22": "倒計時",
+  "study_student_全历史_23": "全歷史",
+  "study_student_公式编辑_24": "公式編輯",
+  "study_student_内容列表_25": "內容列表",
+  "study_student_分_26": "分",
+  "study_student_分子结构_27": "分子結構",
+  "study_student_分屏开启失败_28": "分屏開啟失敗",
+  "study_student_分屏模式已开启_29": "分屏模式已開啟",
+  "study_student_分析_30": "分析",
+  "study_student_分组设置_31": "分組設置",
+  "study_student_刷新_32": "刷新",
+  "study_student_加入成功_33": "加入成功",
+  "study_student_协同文档_34": "協同文檔",
+  "study_student_取消_35": "取消",
+  "study_student_同学回答问题_36": "同學回答問題",
+  "study_student_学习资料_37": "學習資料",
+  "study_student_学生分组_38": "學生分組",
+  "study_student_导出作业_39": "導出作業",
+  "study_student_展开_40": "展開",
+  "study_student_展开目标_41": "展開目標",
+  "study_student_工作区_42": "工作區",
+  "study_student_工具_43": "工具",
+  "study_student_已关闭分屏模式_44": "已關閉分屏模式",
+  "study_student_已开启分屏_45": "已開啟分屏",
+  "study_student_已点击允许_46": "已點擊允許",
+  "study_student_已经有小组比你设置的人数多_47": "已經有小組比你設置的人數多",
+  "study_student_已结束分屏模式_48": "已結束分屏模式",
+  "study_student_应用中心_49": "應用中心",
+  "study_student_开启成功_50": "開啟成功",
+  "study_student_录制_51": "錄製",
+  "study_student_录屏_52": "錄屏",
+  "study_student_思维导图_53": "思維導圖",
+  "study_student_思维网格_54": "思維網格",
+  "study_student_打开链接_55": "打開鏈接",
+  "study_student_批量上传_56": "批量上傳",
+  "study_student_折叠_57": "折疊",
+  "study_student_挑人_58": "挑人",
+  "study_student_排序_59": "排序",
+  "study_student_提交成功_60": "提交成功",
+  "study_student_提示_61": "提示",
+  "study_student_操作成功_62": "操作成功",
+  "study_student_操作过快_63": "操作過快",
+  "study_student_收缩_64": "收縮",
+  "study_student_收起目标_65": "收起目標",
+  "study_student_教师已结束分屏_66": "教師已結束分屏",
+  "study_student_数字画板_67": "數字畫板",
+  "study_student_数学画板_68": "數學畫板",
+  "study_student_文件加载中_69": "文件加載中",
+  "study_student_文档_70": "文檔",
+  "study_student_无法加入_71": "無法加入",
+  "study_student_无法退出_72": "無法退出",
+  "study_student_时间_73": "時間",
+  "study_student_时间轴_74": "時間軸",
+  "study_student_是否让_75": "是否讓",
+  "study_student_智能体_76": "智能體",
+  "study_student_暂无描述_77": "暫無描述",
+  "study_student_暂无提交作业_78": "暫無提交作業",
+  "study_student_未提交_79": "未提交",
+  "study_student_权限_80": "權限",
+  "study_student_查看_81": "查看",
+  "study_student_查看文档_82": "查看文檔",
+  "study_student_模拟驾驶_83": "模擬駕駛",
+  "study_student_正在评分_84": "正在評分",
+  "study_student_正确率_85": "正確率",
+  "study_student_汉字宫_86": "漢字宮",
+  "study_student_流停止监听_87": "流停止監聽",
+  "study_student_海龟编程_88": "海龜編程",
+  "study_student_深度学习_89": "深度學習",
+  "study_student_渲染失败_90": "渲染失敗",
+  "study_student_渲染错误_91": "渲染錯誤",
+  "study_student_源码编辑_92": "源碼編輯",
+  "study_student_点_93": "點",
+  "study_student_生成词云_94": "生成詞雲",
+  "study_student_电子白板_95": "電子白板",
+  "study_student_的数字_96": "的數字",
+  "study_student_目前人数_97": "目前人數",
+  "study_student_目标_98": "目標",
+  "study_student_目标树_99": "目標樹",
+  "study_student_目标管理_100": "目標管理",
+  "study_student_目标罗盘_101": "目標羅盤",
+  "study_student_确定_102": "確定",
+  "study_student_确定后自由预览_103": "確定後自由預覽",
+  "study_student_确定导出作业吗_104": "確定導出作業嗎",
+  "study_student_答对人数_105": "答對人數",
+  "study_student_素材库_106": "素材庫",
+  "study_student_细则_107": "細則",
+  "study_student_统计分析_108": "統計分析",
+  "study_student_维度描述_109": "維度描述",
+  "study_student_网络不佳_110": "網絡不佳",
+  "study_student_翻译_111": "翻譯",
+  "study_student_英语写作_112": "英語寫作",
+  "study_student_英语口语_113": "英語口語",
+  "study_student_获取了分屏数_114": "獲取了分屏數",
+  "study_student_获取分屏数出错_115": "獲取分屏數出錯",
+  "study_student_表格_116": "表格",
+  "study_student_训练平台_117": "訓練平台",
+  "study_student_训练服务器_118": "訓練服務器",
+  "study_student_设置成功_119": "設置成功",
+  "study_student_评一评_120": "評一評",
+  "study_student_评价标准_121": "評價標準",
+  "study_student_评价维度_122": "評價維度",
+  "study_student_评分_123": "評分",
+  "study_student_评分中_124": "評分中",
+  "study_student_评论_125": "評論",
+  "study_student_请检查是否存在麦克风_126": "請檢查是否存在麥克風",
+  "study_student_请稍等_127": "請稍等",
+  "study_student_请输入_128": "請輸入",
+  "study_student_请输入任务描述_129": "請輸入任務描述",
+  "study_student_请重新设置_130": "請重新設置",
+  "study_student_课程设计_131": "課程設計",
+  "study_student_路径搜索_132": "路徑搜索",
+  "study_student_返回_133": "返回",
+  "study_student_退出成功_134": "退出成功",
+  "study_student_选择匹配_135": "選擇匹配",
+  "study_student_选择题_136": "選擇題",
+  "study_student_问卷调查_137": "問卷調查",
+  "study_student_问答_138": "問答",
+  "study_student_随机码_139": "隨機碼",
+  "study_student_魔盒识字_140": "魔盒識字"
 }