Prechádzať zdrojové kódy

Merge branch 'beta' into HK

SanHQin 5 mesiacov pred
rodič
commit
07b88738b7

+ 4 - 0
dist/index.html

@@ -27,7 +27,11 @@
     html,
     body{
       font-family: '黑体';
+<<<<<<< HEAD
     }</style><link href=./static/css/app.1b2f68908d020639721c6442226fabb2.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.b2299056e030e9dd4cb8.js></script><script type=text/javascript src=./static/js/app.ea115d76cfaf1b035df3.js></script></body></html><script>function stopSafari() {
+=======
+    }</style><link href=./static/css/app.5f719fe5e2e4d76f7c0a70befd954e9f.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.acc9cff1d5ed8d2b9ae3.js></script><script type=text/javascript src=./static/js/app.3b94b9dfb3b2512fea9f.js></script></body></html><script>function stopSafari() {
+>>>>>>> beta
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/css/app.5f719fe5e2e4d76f7c0a70befd954e9f.css


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/css/app.5f719fe5e2e4d76f7c0a70befd954e9f.css.map


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1 - 0
dist/static/js/app.3b94b9dfb3b2512fea9f.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1 - 0
dist/static/js/app.3b94b9dfb3b2512fea9f.js.map


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1 - 0
dist/static/js/app.ea115d76cfaf1b035df3.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/js/app.ea115d76cfaf1b035df3.js.map


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/js/vendor.acc9cff1d5ed8d2b9ae3.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
dist/static/js/vendor.acc9cff1d5ed8d2b9ae3.js.map


+ 4 - 0
src/components/components/appStoreC.vue

@@ -18,6 +18,7 @@
                     scrolling = "no"
                     :src="urlData"
                     ref="appStore"
+                    :class="[urlData.indexOf('story-telling') ? 'minH':'']"
                     style="width: 100%;height: 99%;"
                 ></iframe>
             </div>
@@ -132,4 +133,7 @@ import { myMixin } from "@/mixins/mixin.js"
   padding: 0 !important;
   height: 100% !important;
 }
+.minH{
+    min-height: 800px;
+}
 </style>

+ 18 - 5
src/components/components/askStatic.vue

@@ -159,11 +159,6 @@ export default {
       checkJson2: [],
     };
   },
-  watch: {
-    askJSON(val) {
-      this.askJSONC = this.askJSON ? JSON.parse(this.askJSON)[0] : {};
-    },
-  },
   methods: {
     handleClose(done) {
       done();
@@ -175,6 +170,24 @@ export default {
     },
   },
   watch: {
+    //  askJSON: {
+      
+    //   handler(val) {
+    //     console.log('valvalvalvalvalvalvalvalvalvalvalvalvalval',val);
+
+    //     try {
+    //       this.askJSONC = val ? JSON.parse(val)[0] : {};
+    //     } catch (e) {
+    //       console.error('JSON解析错误:', e);
+    //       this.askJSONC = {};
+    //     }
+    //   },
+    //   immediate: true, // 可选,是否立即执行一次
+    //   deep: true
+    // },
+    // askJSON(val) {
+    //   this.askJSONC = this.askJSON ? JSON.parse(this.askJSON)[0] : {};
+    // },
     checkJson: {
       immediate: true,
       deep: true,

+ 53 - 6
src/components/components/askStatic2.vue

@@ -25,7 +25,7 @@
               <div
                 style="
                   width: auto;
-                  display: block;
+                  display: flex;
                   white-space: nowrap;
                   overflow: hidden;
                   text-overflow: ellipsis;
@@ -203,7 +203,41 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              // 纯文本,整体渲染
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -238,9 +272,9 @@ export default {
         this.checkJson2 = this.checkJson;
       },
     },
-    askJSON(val) {
-      this.askJSONC = this.askJSON ? JSON.parse(this.askJSON)[0] : {};
-    },
+    // askJSON(val) {
+    //   this.askJSONC = this.askJSON ? JSON.parse(this.askJSON)[0] : {};
+    // },
   },
   mounted() {
     // this.askJSONC = this.askJSON ? JSON.parse(this.askJSON)[0] : {};
@@ -279,8 +313,21 @@ export default {
   font-size: 18px;
   width: 100%;
 }
-.a_add_head >>> .katex{
+
+.a_add_head >>> .katex {
   font-size: 16px;
+  display: block;
+  width: 100%;
+  white-space: normal;
+}
+.a_add_head >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
+
+.a_add_head >>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
 }
 .a_add_head .a_add_head_input {
   width: 300px;

+ 56 - 8
src/components/components/choseWorksDetailDialog.vue

@@ -57,7 +57,7 @@
                     @click="upLoadApp">作业提交</el-button>
                   </div>
 
-                  <span v-if="testData.toolDetail">{{ testData.toolDetail }}</span>
+                  <span v-if="testData.toolDetail"><span v-html="renderedFormula(testData.toolDetail)"></span></span>
 									<span v-else>无</span>
                 </div>
 
@@ -85,7 +85,7 @@
                         >
                           (多选题)
                         </div>
-                        <div>题目:<span v-html="renderedFormula(item1.teststitle)"></span></div>
+                        <div style="display: flex;align-items: center;">题目:<span v-html="renderedFormula(item1.teststitle)"></span></div>
                       </div>
                       <img
                         v-if="item1.img"
@@ -335,9 +335,9 @@
                         :key="index1"
                       >
                         <div class="a_add_head">
-                          <div style="display: flex">
+                          <div style="display: flex;">
                             <span class="askIndex"> {{ index1 + 1 }}</span>
-                            <div>题目:{{ testData.askJson[index1].askstitle }}</div>
+                            <div style="display: flex;align-items: center;">题目:{{ testData.askJson[index1].askstitle }}</div>
                           </div>
                           <img
                             v-if="testData.askJson[index1].img"
@@ -1040,11 +1040,12 @@
                     </svg>
 
                     <span
+                    style="display: flex;align-items: center;"
                       >{{
                         typeof item.answer === "number"
                           ? "单选题:"
                           : "多选题:"
-                      }}{{ item.title }}</span
+                      }}<span v-html="renderedFormula(item.title)"></span></span
                     >
                   </div>
 
@@ -1523,7 +1524,41 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              // 纯文本,整体渲染
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -4352,7 +4387,20 @@ ol {
   color: rgb(80, 80, 80);
   margin-bottom: 20px;
 }
-.a_add_head >>> .katex{
-  font-size: 14px;
+
+.a_add_head >>> .katex {
+  font-size: 16px;
+  display: block;
+  width: 100%;
+  white-space: normal;
+}
+.a_add_head >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
+
+.a_add_head >>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
 }
 </style>

+ 22 - 13
src/components/components/cocoFlowDia.vue

@@ -15,23 +15,32 @@
             </div>
            
             <div class="markDialog">
-                <template  v-for="(item,index) in listData">
-                    <div class="BodyCon" v-if="item.messages.length"  :key="index">
-                        <div class="BodyConTit">节点{{ index + 1}}</div>
-
-                        <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
-                            <div class="left" v-if="po.role == 'assistant'">
-                                    <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
-                                    <div class="con" v-html="MarkdownT(po.content)"></div>
-                            </div>
-
-                            <div class="left" v-if="po.role == 'user'">
-                                    <div class="TName" style="background-color: #9747FF;">{{ username }}</div>
-                                    <div class="con" v-html="po.content"></div>
+                <template v-if="listData.length && listData[0].messages.length">
+                    <div v-for="(item,index) in listData" :key="index">
+                        <div class="BodyCon" v-if="item.messages.length"  >
+                            <div class="BodyConTit">节点{{ index + 1}}</div>
+                            <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
+                                <div class="left" v-if="po.role == 'assistant'">
+                                        <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
+                                        <div class="con" v-html="MarkdownT(po.content)"></div>
+                                </div>
+
+                                <div class="left" v-if="po.role == 'user'">
+                                        <div class="TName" style="background-color: #9747FF;">{{ username }}</div>
+                                        <div class="con" v-html="po.content"></div>
+                                </div>
                             </div>
                         </div>
                     </div>
                 </template>
+                <div v-else style="text-align: center;
+                    display: flex;
+                    justify-content: center;
+                    align-items: center;
+                    height: 100%;
+                    min-height: 500px;">
+                    作业暂时只能展示对话文字哦~
+                </div>
             </div>
             
 

+ 241 - 0
src/components/components/sortToolWorkShow.vue

@@ -0,0 +1,241 @@
+<template>
+    <div style="width: 100%;" v-if="sortData.length">
+        <div class="SortTool" v-for="(e,ind) in sortData" :key="ind + 'k'">
+                <el-button type="primary" @click="lookStu(ind)" class="btn" >查看学生</el-button>
+                <div class="tabCon">
+                    <div class="con" style="width: 30%;">
+                        <div>句子</div>
+                        <div v-for="(i,index) in e" :key="index" style="display: flex;align-items: center;">
+                            <el-tooltip class="item" effect="dark" :content="i.value" placement="top-start">
+                             <div class="TitTimu" :style="{color:i.value == i.trA? '#409EFF' :'' }">{{ i.value }}</div>
+                            </el-tooltip>
+                            
+                            <img style="height: 15px;width: 15px;margin-left: 10px;" v-if="i.value == i.trA" src="../../assets/right.png" alt="">
+                        </div>
+                        <div>
+                            正确率
+                        </div>
+                    </div>
+                    <div class="con" style="width: 10%;">
+                        <div>小计</div>
+                        <div v-for="(i,index) in e" :key="index">
+                            {{ i.count }}
+                        </div>
+                        <template v-if="e.find(k => k.isD)">
+                            <span v-for="(i,index) in e" :key="index+'p'">
+                                <span v-if="i.value == i.trA">{{ i.pro }}%</span>
+                            </span>
+                        </template>
+                        <span v-else>
+                            0%
+                        </span>
+                        
+                    </div>
+                    <div class="con" style="width: 60%;">
+                        <div>比例</div>
+                        <div v-for="(i,index) in e" :key="index">
+                            <el-progress :percentage="i.pro"></el-progress>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <el-dialog
+                title="查看"
+                :visible.sync="dialogVisible"
+                :append-to-body="true"
+                width="900px"
+                :before-close="handleClose"
+                class="dialog_diy"
+                >
+                <div>
+                    <div v-for="(item, index) in PData" :key="index" class="borderB">
+                        <div style="font-size: 18px;color: #000;margin-bottom: 10px;">
+                            {{ item.sName }}:
+                        </div>
+                        <div>
+                          答案:<span :style="{color:JSON.parse(item.works)[itemIndex].chooseSenList.join('') == JSON.parse(item.works)[itemIndex].rightAnswer.join('')? '#409EFF' :'' }">
+                                    {{ JSON.parse(item.works)[itemIndex].chooseSenList.join('') }}
+                                </span>
+                            <img style="height: 15px;width: 15px;margin-left: 10px;" 
+                            v-if="JSON.parse(item.works)[itemIndex].chooseSenList.join('') == JSON.parse(item.works)[itemIndex].rightAnswer.join('')" 
+                            src="../../assets/right.png" alt="">
+
+                        </div>
+                    </div>
+                </div>
+                <span slot="footer" class="dialog-footer">
+                    <el-button @click="dialogVisible = false">
+                        关 闭
+                    </el-button>
+                </span>
+            </el-dialog>
+
+
+    </div>
+   
+</template>
+
+<script>
+    export default {
+        props: ["people"],
+        data(){
+            return {
+                PData:[], //所有作业
+                sortData:[], //作业分类
+                dialogVisible:false,
+                itemIndex:0
+            }
+        },
+        watch:{
+            people: {
+                handler(newVal) {
+                    if (JSON.stringify(newVal) != JSON.stringify(this.PData)) {
+                        this.PData = JSON.parse(JSON.stringify(newVal))
+                        this.workData()
+                    }
+                },
+                deep: true  // 深度监听对象内部变化
+            }
+        },
+        methods:{
+            handleClose(done) {
+                done();
+            },
+            workData(){
+                let allWork = [] ///整理数据
+                let groups = [] ///结果数据
+                if (this.PData.length == 0) return
+                // console.log('his.PData',this.PData);
+                
+                JSON.parse(this.PData[0].works).forEach(e=>{
+                    allWork.push([])
+                    groups.push([])
+                })
+
+                this.PData.forEach(e => {
+                    JSON.parse(e.works).forEach((k,kin)=>{
+                        allWork[kin].push(k.chooseSenList.join(''))
+                    })
+                });
+
+                for (let index = 0; index < allWork.length; index++) {
+                    groups[index] = this.countDuplicates(allWork[index])
+                }
+
+                // let groups = this.countDuplicates(allWork)
+                for (let index = 0; index < groups.length; index++) {
+                    for (let kin = 0; kin < groups[index].length; kin++) {
+                        groups[index][kin].pro = 0
+                        groups[index][kin].isD = groups[index][kin].value == JSON.parse(this.PData[0].works)[index].rightAnswer.join('')
+                        groups[index][kin].trA = JSON.parse(this.PData[0].works)[index].rightAnswer.join('')
+                        groups[index][kin].pro = ((groups[index][kin].count / this.PData.length) * 100).toFixed()
+                    }
+                }
+
+                
+                this.sortData = groups
+                // console.log('allWork',allWork);
+
+                // console.log('groups',groups);
+                
+            },
+            countDuplicates(arr) {
+                const countMap = {};
+                
+                arr.forEach(item => {
+                    countMap[item] = (countMap[item] || 0) + 1;
+                });
+                
+                return Object.entries(countMap).map(([value, count]) => ({
+                    value,
+                    count
+                }));
+            },
+            lookStu(val){
+                this.itemIndex = val
+                this.dialogVisible = true
+            }
+        },
+        mounted(){
+            this.PData = JSON.parse(JSON.stringify(this.people))
+            this.workData()
+        }
+    }
+</script>
+
+<style scoped>
+.SortTool{
+    width: 90%;
+    margin: 0 0 10px 25px;
+    padding: 18px 20px;
+    box-sizing: border-box;
+    position: relative;
+}
+.tabCon{
+    width: 80%;
+    display: flex;
+}
+.con div{
+    height: 25px;
+    line-height: 25px;
+    margin-bottom: 8px;
+}
+.btn{
+    position: absolute;top: 0;right: 0;
+}
+.dialog_diy >>> .el-dialog__header,
+.dialog_diy1 >>> .el-dialog__header {
+  background: #454545 !important;
+  padding: 15px 20px;
+}
+
+.dialog_diy >>> .el-dialog__title,
+.dialog_diy1 >>> .el-dialog__title {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn,
+.dialog_diy1 >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close,
+.dialog_diy1 >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover,
+.dialog_diy1 >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #fff;
+}
+
+.dialog_diy1 >>> .el-dialog__body {
+  padding: 0;
+}
+
+.dialog_diy >>> .el-dialog__body,
+.dialog_diy >>> .el-dialog__footer,
+.dialog_diy1 >>> .el-dialog__footer {
+  background: #fafafa;
+}
+.borderB{
+    margin-bottom: 20px;
+}
+.right::after {
+  content: "";
+  /* position: absolute; */
+  background-image: url(../../assets/right.png);
+  min-width: 15px;
+  min-height: 15px;
+  background-size: 100% 100%;
+  margin: 0 10px;
+}
+.TitTimu{
+    max-width: 80%;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    margin-bottom: 0 !important;
+}
+</style>

+ 86 - 31
src/components/components/studentWorkPreviewDialog.vue

@@ -37,8 +37,9 @@
                   </svg>
 
                   <span
+                    style="display: flex;align-items: center;"
                     >{{ item.type == 1 ? "单选题:" : "多选题:"
-                    }}{{ item.teststitle }}</span
+                    }}<span v-html="renderedFormula(item.teststitle)"></span> </span
                   >
                 </div>
                 <div
@@ -270,38 +271,32 @@
               </div>
             </div>
             <div class="s_b_m_tool40" v-if="[72].includes(tool)">
-              <!-- <div  style="margin-bottom: 20px;" v-for="(item,index) in JSON.parse(studentWork.works)" :key="index">
-                <div style="margin-bottom: 15px;font-size: 20px;font-weight: 600;color: #000;">第{{ index + 1}}阶段</div>
-                <div v-for="(po,pInd) in item.messages" :key="pInd+'pInd'">
-                    <div class="left" v-if="po.role == 'assistant'">
-                            <div class="TName">小可AI助手</div>:
-                            <div class="con"  v-html="MarkdownT(po.content)"></div>
-                    </div> -->
-                    <!-- <div class="left" v-if="po.role == 'user'">
-                            <div class="TName">{{ studentWork.sName }}</div>:
-                            <div class="con" v-html="po.content"></div>
+              <template v-if="JSON.parse(studentWork.works).length && JSON.parse(studentWork.works)[0].messages.length">
+                <div v-for="(item,index) in JSON.parse(studentWork.works)" :key="index">
+                    <div class="BodyCon" v-if="item.messages.length" >
+                        <div class="BodyConTit">节点{{ index + 1}}</div>
+                        <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
+                            <div class="left" v-if="po.role == 'assistant'">
+                                    <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
+                                    <div class="con" v-html="MarkdownT(po.content)"></div>
+                            </div>
+
+                            <div class="left" v-if="po.role == 'user'">
+                                    <div class="TName" style="background-color: #9747FF;">{{ studentWork.sName }}</div>
+                                    <div class="con" v-html="po.content"></div>
+                            </div>
+                        </div>
                     </div>
                 </div>
-            </div> -->
-
-              <template v-for="(item,index) in JSON.parse(studentWork.works)">
-                  <div class="BodyCon" v-if="item.messages.length"  :key="index">
-                      <div class="BodyConTit">节点{{ index + 1}}</div>
-
-                      <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
-                          <div class="left" v-if="po.role == 'assistant'">
-                                  <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
-                                  <div class="con" v-html="MarkdownT(po.content)"></div>
-                          </div>
-
-                          <div class="left" v-if="po.role == 'user'">
-                                  <div class="TName" style="background-color: #9747FF;">{{ studentWork.sName }}</div>
-                                  <div class="con" v-html="po.content"></div>
-                          </div>
-                      </div>
-                  </div>
               </template>
-
+              <div v-else style="text-align: center;
+                    display: flex;
+                    justify-content: center;
+                    align-items: center;
+                    height: 100%;
+                    min-height: 500px;">
+                  作业暂时只能展示对话文字哦~
+              </div>
             </div>
           </div>
         </div>
@@ -312,7 +307,8 @@
 
 <script>
 import MarkdownIt from "markdown-it";
-
+import katex from 'katex'
+import 'katex/dist/katex.min.css'
 export default {
   components: {},
   data() {
@@ -404,6 +400,50 @@ export default {
     }
   },
   computed: {
+    renderedFormula() {
+      return function(val){
+       try {
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              // 纯文本,整体渲染
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
+        } catch (e) {
+          console.error('KaTeX渲染错误:', e);
+          return val;
+        }
+      }
+    },
     MarkdownT() {
       return function (c) {
         let md = new MarkdownIt();
@@ -469,6 +509,21 @@ export default {
   overflow: auto;
 }
 
+.studentWorkPreviewDialog >>> .katex {
+  font-size: 16px;
+  display: block;
+  width: 100%;
+  white-space: normal;
+}
+.studentWorkPreviewDialog >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
+
+.studentWorkPreviewDialog >>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
+}
 .s_body {
   width: 100%;
   height: 100%;

+ 8 - 12
src/components/courseDetail.vue

@@ -779,6 +779,7 @@
                     >
                       <div class="stage_box" style="left: -195px">
                         <div
+                        v-if="item.time"
                           style="
                             min-width: 150px;
                             position: relative;
@@ -793,10 +794,7 @@
                             (item.chapter.length == 1 ||
                               item.chapter.length > 1) &&
                             (item.chapter[0].task.length == 1 ||
-                              item.chapter[0].task.length > 1) &&
-                            item.chapter[0].task[0].works.length == 0
-                              ? 'bgCss'
-                              : ''
+                              item.chapter[0].task.length > 1)
                           "
                         ></div>
                         <div
@@ -806,10 +804,7 @@
                               (item.chapter.length == 1 ||
                                 item.chapter.length > 1) &&
                               (item.chapter[0].task.length == 1 ||
-                                item.chapter[0].task.length > 1) &&
-                              item.chapter[0].task[0].works.length == 0
-                                ? '#ccc'
-                                : '',
+                                item.chapter[0].task.length > 1) ,
                           }"
                         >
                           第{{ index + 1 }}阶段 {{ item.name }}
@@ -821,10 +816,7 @@
                               (item.chapter.length == 1 ||
                                 item.chapter.length > 1) &&
                               (item.chapter[0].task.length == 1 ||
-                                item.chapter[0].task.length > 1) &&
-                              item.chapter[0].task[0].works.length == 0
-                                ? 'none'
-                                : '',
+                                item.chapter[0].task.length > 1) ,
                           }"
                           :class="{ s_up2: !item.is }"
                           @click="item.is = !item.is"
@@ -901,6 +893,8 @@
                                     <div v-if="item3.tool == 8">素材库</div>
                                     <div v-if="item3.tool == 17">学习资料</div>
                                     <div v-if="item3.tool == 2">便签</div>
+                                    <div v-if="item3.tool == 52">文档</div>
+                                    <div v-if="item3.tool == 72">AI应用</div>
                                     <div v-if="item3.tool == 4">问卷调查</div>
                                     <div v-if="item3.tool == 45">选择题</div>
                                     <div v-if="item3.tool == 10">倒计时</div>
@@ -936,6 +930,8 @@
                                     <div v-if="item3.tool == 58">模拟驾驶</div>
                                     <div v-if="item3.tool == 59">路径搜索</div>
                                     <div v-if="item3.tool == 60">深度学习</div>
+                                    <div v-if="item3.tool == 69">英语写作</div>
+                                    <div v-if="item3.tool == 70">英语口语</div>
                                   </div>
                                 </div>
                                 <div

+ 206 - 67
src/components/easy2/commpont/markDialog.vue

@@ -196,42 +196,43 @@
             <i class="el-icon-arrow-down"></i>提交列表 ({{ workList.length }})
           </div>
           <div style="overflow: auto;flex: 1;">
-            <div
-              v-if="workListShow"
-              v-for="(i, index) in workList"
-              :key="index"
-              :class="['schPer', i.userid == DgUid ? 'selBlock' : '']"
-              style="cursor: pointer;"
-              @click="cutPer(i.userid, index)"
-            >
-              <img v-if="i.headportrait" :src="i.headportrait" alt="" />
-              <img
-                v-else
-                src="https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/static/img/portal.b3cf7fa.png"
-                alt=""
-              />
-
-              <div class="con">
-                <div class="tit">
-                  <span
-                    style="font-size: 14px;color: rgba(0, 0, 0, 0.9);font-weight: 400;"
-                    >{{ i.name }}</span
-                  >
+            <template v-if="workListShow">
+              <div
+                v-for="(i, index) in workList"
+                :key="index"
+                :class="['schPer', i.userid == DgUid ? 'selBlock' : '']"
+                style="cursor: pointer;"
+                @click="cutPer(i.userid, index)"
+              >
+                <img v-if="i.headportrait" :src="i.headportrait" alt="" />
+                <img
+                  v-else
+                  src="https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/static/img/portal.b3cf7fa.png"
+                  alt=""
+                />
 
-                  <span
-                    style="font-size: 14px;color:rgba(0, 0, 0, 0.4);"
-                    v-if="i.markSco == null"
-                    >未评分</span
-                  >
-                  <span
-                    v-else
-                    style="font-size: 16px;color: rgba(0, 0, 0, 0.9);font-weight: 600;"
-                    >{{ i.markSco }}</span
-                  >
+                <div class="con">
+                  <div class="tit">
+                    <span
+                      style="font-size: 14px;color: rgba(0, 0, 0, 0.9);font-weight: 400;"
+                      >{{ i.name }}</span
+                    >
+
+                    <span
+                      style="font-size: 14px;color:rgba(0, 0, 0, 0.4);"
+                      v-if="i.markSco == null"
+                      >未评分</span
+                    >
+                    <span
+                      v-else
+                      style="font-size: 16px;color: rgba(0, 0, 0, 0.9);font-weight: 600;"
+                      >{{ i.markSco }}</span
+                    >
+                  </div>
+                  <div class="Timer">{{ i.time }}</div>
                 </div>
-                <div class="Timer">{{ i.time }}</div>
               </div>
-            </div>
+            </template>
           </div>
         </div>
       </div>
@@ -722,8 +723,75 @@ export default {
         }
       }
 
-      let messages = `
-      #NOTICE#
+      let messages = ''
+      if (this.currentUid.type == 20) {
+        messages = `#NOTICE#
+                Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
+          - 深入理解教育评价标准,准确判断对话内容是否符合要求。
+          - 具备较强的文本分析能力,从对话中有效提取评价相关信息。
+          - 拥有客观公正的态度,确保评分结果公平合理。
+          - 能够清晰准确地表达评语,使学生和教师易于理解。
+          - 熟悉各类学习作业的要求和重点,为评价提供依据。
+          - 掌握一定的教育教学知识,更好地分析对话在教育场景中的意义。 
+                Language: ${this.getLang()}
+                ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
+                Instruction: Based on the context, follow "Format example", write content.
+
+                #目标#
+                你要结合<作业内容><评价标准>和该标准对应的<等级>写评语。
+          ${this.currentUid.type == 1 ? "提取图片内容进行评价" : ""} 
+                #评分资料#
+                评价标准:${std}
+                评价细则:${laws}
+                等级:${sco}
+                作业内容:${_fileid ? "知识库中上传的文件内容" : con}
+        具体你步骤如下:
+        1. 作业内容审查:仔细阅读需要评价的作业内容,标记出可能与评价相关的部分,如知识点的回答准确性、回答的完整性、语言表达的规范性等。
+        2. 掌握评价标准:阅读理解并掌握评价标准的结构与内容,包括评价维度、不同等级以及对应的评价细则的内容为评价标准。
+        3. 评分计算:针对提取的作业内容按照确定的评价标准,对标记出的评价相关部分进行量化打分,输出评分结果。
+        4. 评语生成:根据评分结果和对话中的具体情况,撰写评语,指出优点和不足之处,以帮助学生自查作业并为教师提供评价和指导依据。
+
+        ### 理论框架
+        ### 教育目标分类理论
+        1. 基本原理:
+        - 将教育目标按照不同的层次分类,如认知领域、情感领域和动作技能领域等。
+        - 有助于明确教学活动期望达成的目标类型。
+        - 为评价教学成果提供了分类框架。
+        2. 具体应用:
+        - 分析对话中涉及的目标类型,判断是否符合预期的教育目标。
+        - 依据不同目标类型的要求,评估对话对学生相应能力的促进作用。
+        - 对比不同对话内容在目标达成度上的差异进行评分。
+
+        ### 教学评价理论
+        1. 基本原理:
+        - 关注教学过程和结果的评价,包括对教师教学行为和学生学习成果的评价。
+        - 从多个维度进行评价,如教学内容、教学方法、学习效果等。
+        - 强调评价的客观性、全面性和发展性。
+        2. 具体应用:
+        - 从对话中提取与教学内容、方法相关的信息进行评价。
+        - 考量对话对学生学习效果的影响来给出评分。
+        - 根据评价结果提出改进和发展的建议。
+
+        ### 对话分析理论
+        1. 基本原理:
+        - 着重对对话结构、话语功能、交互模式等进行分析。
+        - 揭示对话中的信息流动、话语权分配等情况。
+        - 有助于理解对话参与者之间的关系和互动效果。
+        2. 具体应用:
+        - 剖析“小可ai助手”与学生对话的结构合理性。
+        - 分析话语功能是否有助于学习和评价目的。
+        - 根据交互模式判断对话是否有利于学生参与和学习,从而给出评分。
+            
+          #输出格式#
+        [{'comment':'评语(150个汉字左右)'}]
+
+
+        #输出范例#
+        [{'comment':'学生能够全面且正确地描述光合作用中氧气和葡萄糖的生成过程,涵盖光反应和暗反应的每个阶段和主要反应物及产物。同时,学生也能够全面、准确地解释氧气和葡萄糖在植物生命活动中的重要作用,并展示了对光合作用的深入理解。论文结构良好,内容详实,逻辑清晰,论据充分。'}]
+        注意检查输出评语不超过50字`
+
+      }else{
+        messages = `#NOTICE#
         Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
         Language: ${this.getLang()}
         ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
@@ -754,6 +822,8 @@ export default {
         #输出范例#
         [{'comment':'学生能够全面且正确地描述光合作用中氧气和葡萄糖的生成过程,涵盖光反应和暗反应的每个阶段和主要反应物及产物。同时,学生也能够全面、准确地解释氧气和葡萄糖在植物生命活动中的重要作用,并展示了对光合作用的深入理解。论文结构良好,内容详实,逻辑清晰,论据充分。'}]
         `;
+      }
+      
       // console.log("messages", messages);
 
       let params = {
@@ -1017,7 +1087,7 @@ export default {
         }
       }
 
-      console.log("tit", JSON.parse(JSON.stringify(tit)));
+      // console.log("tit", JSON.parse(JSON.stringify(tit)));
 
       let con = this.cuScoCon;
 
@@ -1101,38 +1171,107 @@ export default {
           }
         }
       }
-
-      let msg = `NOTICE
-     Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
-      Language: ${this.getLang()}
-      ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
-      Instruction: Based on the context, follow "Format example", write content.
-
-      #目标#
-      你要根据“六级评价细则”点评学生作品,并生成需要的JSON数据。
-      你要根据<评价细则>和<作业内容>的相关性评价作业,判断该作业属于六级中的哪个等级。
-      你要结合<评价标准><评价细则>和<你判断的等级>写评语。
-      如果作业内容与评价细则无关,则直接评为0星。如果作业内容与<任务描述>或<工具描述>一致或者相似,则直接评为0星,并输出评语“期待看到你自己的想法!必要时,可以请教老师哦~”
-      ${work.type == 1 ? "提取图片内容进行评价" : ""}
-
-      #评分资料#
-      评价标准:${std}
-      评价细则:${laws}
-      作业内容:${_fileid ? "上传的文件内容" : con}
-      任务描述:${this.taskDetail ? this.taskDetail : ""}
-      工具描述:${this.tool.toolDetail ? this.tool.toolDetail : ""}
+      console.log('con',con);
       
-   
-      #输出要求#
-      输出每个评价标准角度的“等级”和作业的综合性“评语”。
-      “评语”控制在150字左右。
-      评价标准要按原样输出,严格按照输出格式输出json格式。只输出json格式的内容,其他内容不要输出!
-
-      #输出格式#
-      [${text}{'comment':'评语(150个汉字左右)'${
-        work.type == 1 ? "{'pic':'提取图片内容'}" : ""
-      }}]
-      `;
+      let msg = ''
+      if (work.type == 20) {
+              msg =  `#NOTICE#
+                    Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
+              - 深入理解教育评价标准,准确判断对话内容是否符合要求。
+              - 具备较强的文本分析能力,从对话中有效提取评价相关信息。
+              - 拥有客观公正的态度,确保评分结果公平合理。
+              - 能够清晰准确地表达评语,使学生和教师易于理解。
+              - 熟悉各类学习作业的要求和重点,为评价提供依据。
+              - 掌握一定的教育教学知识,更好地分析对话在教育场景中的意义。 
+                    Language: ${this.getLang()}
+                    ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
+                    Instruction: Based on the context, follow "Format example", write content.
+
+                    #目标#
+                    你要结合<作业内容><评价标准>和该标准对应的<等级>写评语。
+              ${this.currentUid.type == 1 ? "提取图片内容进行评价" : ""} 
+                    #评分资料#
+                    评价标准:${std}
+                    评价细则:${laws}
+                    等级:${text}
+                    作业内容:${_fileid ? "知识库中上传的文件内容" : con}
+            具体你步骤如下:
+            1. 作业内容审查:仔细阅读需要评价的作业内容,标记出可能与评价相关的部分,如知识点的回答准确性、回答的完整性、语言表达的规范性等。
+            2. 掌握评价标准:阅读理解并掌握评价标准的结构与内容,包括评价维度、不同等级以及对应的评价细则的内容为评价标准。
+            3. 评分计算:针对提取的作业内容按照确定的评价标准,对标记出的评价相关部分进行量化打分,输出评分结果。
+            4. 评语生成:根据评分结果和对话中的具体情况,撰写评语,指出优点和不足之处,以帮助学生自查作业并为教师提供评价和指导依据。
+
+            ### 理论框架
+            ### 教育目标分类理论
+            1. 基本原理:
+            - 将教育目标按照不同的层次分类,如认知领域、情感领域和动作技能领域等。
+            - 有助于明确教学活动期望达成的目标类型。
+            - 为评价教学成果提供了分类框架。
+            2. 具体应用:
+            - 分析对话中涉及的目标类型,判断是否符合预期的教育目标。
+            - 依据不同目标类型的要求,评估对话对学生相应能力的促进作用。
+            - 对比不同对话内容在目标达成度上的差异进行评分。
+
+            ### 教学评价理论
+            1. 基本原理:
+            - 关注教学过程和结果的评价,包括对教师教学行为和学生学习成果的评价。
+            - 从多个维度进行评价,如教学内容、教学方法、学习效果等。
+            - 强调评价的客观性、全面性和发展性。
+            2. 具体应用:
+            - 从对话中提取与教学内容、方法相关的信息进行评价。
+            - 考量对话对学生学习效果的影响来给出评分。
+            - 根据评价结果提出改进和发展的建议。
+
+            ### 对话分析理论
+            1. 基本原理:
+            - 着重对对话结构、话语功能、交互模式等进行分析。
+            - 揭示对话中的信息流动、话语权分配等情况。
+            - 有助于理解对话参与者之间的关系和互动效果。
+            2. 具体应用:
+            - 剖析“小可ai助手”与学生对话的结构合理性。
+            - 分析话语功能是否有助于学习和评价目的。
+            - 根据交互模式判断对话是否有利于学生参与和学习,从而给出评分。
+                
+             #输出格式#
+                [${text}{'comment':'评语(150个汉字左右)'${
+                  work.type == 1 ? "{'pic':'提取图片内容'}" : ""
+                }}]
+            注意检查输出评语不超过50字`
+
+      }else{
+          msg = `NOTICE
+              Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
+                Language: ${this.getLang()}
+                ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
+                Instruction: Based on the context, follow "Format example", write content.
+
+                #目标#
+                你要根据“六级评价细则”点评学生作品,并生成需要的JSON数据。
+                你要根据<评价细则>和<作业内容>的相关性评价作业,判断该作业属于六级中的哪个等级。
+                你要结合<评价标准><评价细则>和<你判断的等级>写评语。
+                如果作业内容与评价细则无关,则直接评为0星。如果作业内容与<任务描述>或<工具描述>一致或者相似,则直接评为0星,并输出评语“期待看到你自己的想法!必要时,可以请教老师哦~”
+                ${work.type == 1 ? "提取图片内容进行评价" : ""}
+
+                #评分资料#
+                评价标准:${std}
+                评价细则:${laws}
+                作业内容:${_fileid ? "上传的文件内容" : con}
+                任务描述:${this.taskDetail ? this.taskDetail : ""}
+                工具描述:${this.tool.toolDetail ? this.tool.toolDetail : ""}
+                
+            
+                #输出要求#
+                输出每个评价标准角度的“等级”和作业的综合性“评语”。
+                “评语”控制在150字左右。
+                评价标准要按原样输出,严格按照输出格式输出json格式。只输出json格式的内容,其他内容不要输出!
+
+                #输出格式#
+                [${text}{'comment':'评语(150个汉字左右)'${
+                  work.type == 1 ? "{'pic':'提取图片内容'}" : ""
+                }}]
+                `;
+      }
+    
       // console.log(msg);
       this.aiGet2(msg, _fileid, work);
     },

+ 1 - 1
src/components/easy2/commpont/markScore.vue

@@ -429,7 +429,7 @@ export default {
               _this.ajax
                 .get(_this.$store.state.api + "updateWorksEvaTwo", params)
                 .then(res => {
-                  console.log('999999999999999999999999999999999999999999999999999');
+                  // console.log('999999999999999999999999999999999999999999999999999');
                   this.getData()
                   this.$emit('refreshOther',{tid:this.toolIndex,wid:this.wIndex})
                   

+ 253 - 122
src/components/easy2/studyStudent.vue

@@ -522,9 +522,9 @@
                   v-html="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail
-                      ? chapInfoList[courseType].chapterInfo[0].taskJson[
+                      ? renderedFormula(chapInfoList[courseType].chapterInfo[0].taskJson[
                           taskCount
-                        ].taskDetail
+                        ].taskDetail)
                       : '暂无描述'
                   "
                 ></div>
@@ -1020,7 +1020,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">电子白板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1032,7 +1032,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">思维导图</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1053,7 +1053,7 @@
                             />
                             <div style="margin: 5px 0">思维网格</div>
                             <!-- && worksStudent[toolIndex].length>0 -->
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1089,7 +1089,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问卷调查</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
                             style="position: absolute;right: 153px;top: -30px;">
                               分析
                             </div>
@@ -1118,7 +1118,7 @@
                             <div style="margin: 5px 0">选择题</div>
                             <div
                               class="upload_toolBtn"
-
+                              v-if="tType == 1"
                               @click="
                                 openChoseWorksDetailDialog(
                                   tooC,
@@ -1155,7 +1155,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问答</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
                               style="position: absolute;right: 135px;top: -45px;height: 40px;display: flex;align-items: center;justify-content: center;background: #409EFF;">
                               分析
                             </div>
@@ -1175,7 +1175,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">训练服务器</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1203,7 +1203,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AIoT Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1223,7 +1223,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Python</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1235,7 +1235,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1255,7 +1255,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">数学画板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1267,7 +1267,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">翻译</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1295,7 +1295,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">GeoGebra</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1307,7 +1307,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">源码编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
                               style="position: absolute;right: 153px;top: -42px;">
                               分析
                             </div>
@@ -1325,7 +1325,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">个人评价</div>
-														<div class="upload_toolBtn"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
+														<div class="upload_toolBtn"  v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1337,7 +1337,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">选择匹配</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1357,7 +1357,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">排序</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
+														<div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1369,7 +1369,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">表格</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
+														<div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1381,7 +1381,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">文档</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1393,7 +1393,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">学生分组</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1405,7 +1405,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">CocoPi</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1457,7 +1457,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">海龟编程</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1469,7 +1469,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI智能体</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1494,7 +1494,7 @@
                               {{tool.appJson && tool.appJson.name ? tool.appJson.name : '应用中心'}}
                             </div>
                             </el-tooltip>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1514,7 +1514,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">公式编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1546,7 +1546,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语写作</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1558,7 +1558,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语口语</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1577,7 +1577,7 @@
                       <!-- @click.stop="updateToolDetail(toolIndex, 2)" -->
                       <div
                         style="height:100%;"
-                        v-html="contentConvent(tool.toolDetail)"
+                        v-html="renderedFormula(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
@@ -1968,7 +1968,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -2106,7 +2106,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -2180,7 +2180,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -3447,7 +3447,7 @@
                               <img
                                 style="cursor: pointer"
                                 :src="word2"
-                                @click="downloadFile(w.works)"
+                                @click="downloadFile(w.works,w.userid)"
                                 alt
                               />
                               <!--  @click="openVideo(w.works)" -->
@@ -3991,7 +3991,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <!--  @click="openVideo(w.works)" -->
@@ -4431,7 +4431,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -4609,7 +4609,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -6198,7 +6198,7 @@
                           <div
                             style="
                               width: calc(100% - 130px);
-                              display: block;
+                              display: flex;
                               white-space: nowrap;
                               overflow: hidden;
                               text-overflow: ellipsis;
@@ -9278,13 +9278,17 @@
                         tool.tool.indexOf(47) != -1
                     "
                   >
-                    <AnswerData
+                    <!-- <AnswerData
                       v-if="
                         checkJson[toolIndex].length &&
                           (tool.sentenceList || tool.sentenceList.length > 0)
                       "
                       :people="checkJson[toolIndex]"
-                    ></AnswerData>
+                    ></AnswerData> -->
+                     <sortToolWorkShow  v-if="
+                        worksStudent[toolIndex].length
+                      "
+                      :people="worksStudent[toolIndex]"></sortToolWorkShow>
                   </div>
                   <div
                     v-if="
@@ -10664,7 +10668,7 @@
                                 <img
                                   style="cursor: pointer"
                                   :src="word2"
-                                  @click="downloadFile(w.works)"
+                                  @click="downloadFile(w.works,w.userid)"
                                   alt
                                 />
                                 <!--  @click="openVideo(w.works)" -->
@@ -13017,7 +13021,7 @@
             :key="index1"
           >
             <div class="a_add_head">
-              <div style="display: flex">
+              <div style="display: flex;align-items: center;">
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
@@ -13031,7 +13035,7 @@
                 >
                   (多选题)
                 </div>
-                <div>题目:{{ testJson.testJson[index1].teststitle }}</div>
+                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -14333,7 +14337,7 @@
         <div
           class="worksAnswer codeFileBox"
           v-if="commentDetail.works && commentDetail.type == 12"
-          @click="downloadFile(commentDetail.works)"
+          @click="downloadFile(commentDetail.works,w.userid)"
         >
           <img src="../../assets/icon/codeFile.png" />
           <div>点击下载文件</div>
@@ -16227,6 +16231,7 @@ import AskStatic from "../components/askStatic";
 import AskStatic2 from "../components/askStatic2";
 import AnswerData2 from "../components/answerData2";
 import AnswerData from "../components/answerData";
+import sortToolWorkShow from "../components/sortToolWorkShow.vue";
 import EditorBar from "../tools/wangEnduit.vue";
 import Table from "../tools/table.vue";
 import Time from "../tools/time.vue";
@@ -16339,6 +16344,7 @@ export default {
     SeeBoard,
     AnswerData2,
     AnswerData,
+    sortToolWorkShow,
     Audio,
     ImgDraw,
     Table,
@@ -16929,7 +16935,7 @@ export default {
       toolDetail,
       taskDetail,
       toolList
-    ) {
+    ) {      
       let jude = false;
       this.AIloading.forEach((e, index) => {
         if (index == toolIndex) {
@@ -17053,7 +17059,6 @@ export default {
       for (let i = 0; i < con.length; i++) {
         let _fileid = "";
         let wok = con[i].works;
-        // console.log('con',con);
 
         // console.log('con[i].type',con[i].type);
 
@@ -17068,43 +17073,112 @@ export default {
         }
         // console.log('con[i].type',con[i])
 
-        // console.log('con[i].type',con[i].type)
+        console.log('con[i].type',con[i].type)
 
         if (_fileid == 1 || con[i].type == 3) {
           this.AIloading[toolIndex][i].loading = false;
           continue;
         }
-        let msg = `NOTICE
-        Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
-        Language: ${this.getLang()}
-        ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
-        Instruction: Based on the context, follow "Format example", write content.
 
-        #目标#
-        你要根据“六级评价细则”点评学生作品,并生成需要的JSON数据。
-        你要根据<评价细则>和<作业内容>的相关性评价作业,判断该作业属于六级中的哪个等级。
-        你要结合<评价标准><评价细则>和<你判断的等级>写评语。
-        如果作业内容与评价细则无关,则直接评为0星。如果作业内容与<任务描述>或<工具描述>一致或者相似,则直接评为0星,并输出评语“期待看到你自己的想法!必要时,可以请教老师哦~”
-        ${con[i].type == 0 ? "提取图片内容进行评价" : ""}
+        let msg = ''
+        if(con[i].type == 20){
+           msg = `#NOTICE#
+                  Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
+            - 深入理解教育评价标准,准确判断对话内容是否符合要求。
+            - 具备较强的文本分析能力,从对话中有效提取评价相关信息。
+            - 拥有客观公正的态度,确保评分结果公平合理。
+            - 能够清晰准确地表达评语,使学生和教师易于理解。
+            - 熟悉各类学习作业的要求和重点,为评价提供依据。
+            - 掌握一定的教育教学知识,更好地分析对话在教育场景中的意义。 
+                  Language: ${this.getLang()}
+                  ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
+                  Instruction: Based on the context, follow "Format example", write content.
+
+                  #目标#
+                  你要结合<作业内容><评价标准>和该标准对应的<等级>写评语。
+            ${con[i].type == 0 ? "提取图片内容进行评价" : ""} 
+                  #评分资料#
+                  评价标准:${std}
+                  评价细则:${laws}
+                  等级:${text}
+                  作业内容:${_fileid ? "上传的文件内容" : con[i].works}
+          具体你步骤如下:
+          1. 作业内容审查:仔细阅读需要评价的作业内容,标记出可能与评价相关的部分,如知识点的回答准确性、回答的完整性、语言表达的规范性等。
+          2. 掌握评价标准:阅读理解并掌握评价标准的结构与内容,包括评价维度、不同等级以及对应的评价细则的内容为评价标准。
+          3. 评分计算:针对提取的作业内容按照确定的评价标准,对标记出的评价相关部分进行量化打分,输出评分结果。
+          4. 评语生成:根据评分结果和对话中的具体情况,撰写评语,指出优点和不足之处,以帮助学生自查作业并为教师提供评价和指导依据。
+
+          ### 理论框架
+          ### 教育目标分类理论
+          1. 基本原理:
+          - 将教育目标按照不同的层次分类,如认知领域、情感领域和动作技能领域等。
+          - 有助于明确教学活动期望达成的目标类型。
+          - 为评价教学成果提供了分类框架。
+          2. 具体应用:
+          - 分析对话中涉及的目标类型,判断是否符合预期的教育目标。
+          - 依据不同目标类型的要求,评估对话对学生相应能力的促进作用。
+          - 对比不同对话内容在目标达成度上的差异进行评分。
+
+          ### 教学评价理论
+          1. 基本原理:
+          - 关注教学过程和结果的评价,包括对教师教学行为和学生学习成果的评价。
+          - 从多个维度进行评价,如教学内容、教学方法、学习效果等。
+          - 强调评价的客观性、全面性和发展性。
+          2. 具体应用:
+          - 从对话中提取与教学内容、方法相关的信息进行评价。
+          - 考量对话对学生学习效果的影响来给出评分。
+          - 根据评价结果提出改进和发展的建议。
+
+          ### 对话分析理论
+          1. 基本原理:
+          - 着重对对话结构、话语功能、交互模式等进行分析。
+          - 揭示对话中的信息流动、话语权分配等情况。
+          - 有助于理解对话参与者之间的关系和互动效果。
+          2. 具体应用:
+          - 剖析“小可ai助手”与学生对话的结构合理性。
+          - 分析话语功能是否有助于学习和评价目的。
+          - 根据交互模式判断对话是否有利于学生参与和学习,从而给出评分。
+              
+          #输出格式#
+
+          [${text}{'comment':'评语(150个汉字左右)'}]
+          注意检查输出评语不超过50字`
+        }else{
+          msg = `NOTICE
+            Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
+            Language: ${this.getLang()}
+            ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
+            Instruction: Based on the context, follow "Format example", write content.
+
+            #目标#
+            你要根据“六级评价细则”点评学生作品,并生成需要的JSON数据。
+            你要根据<评价细则>和<作业内容>的相关性评价作业,判断该作业属于六级中的哪个等级。
+            你要结合<评价标准><评价细则>和<你判断的等级>写评语。
+            如果作业内容与评价细则无关,则直接评为0星。如果作业内容与<任务描述>或<工具描述>一致或者相似,则直接评为0星,并输出评语“期待看到你自己的想法!必要时,可以请教老师哦~”
+            ${con[i].type == 0 ? "提取图片内容进行评价" : ""}
 
 
-        #评分资料#
-        评价标准:${std}
-        评价细则:${laws}
-        作业内容:${_fileid ? "上传的文件内容" : JSON.parse(con[i].works).text}
-        任务描述:${taskDetail}
-        工具描述:${toolDetail}
+            #评分资料#
+            评价标准:${std}
+            评价细则:${laws}
+            作业内容:${_fileid ? "上传的文件内容" : JSON.parse(con[i].works).text}
+            任务描述:${taskDetail}
+            工具描述:${toolDetail}
 
 
-        #输出要求#
-        输出每个评价标准角度的“等级”和作业的综合性“评语”。
-        “评语”控制在150字左右。
-        评价标准要按原样输出,严格按照输出格式输出json格式。只输出json格式的内容,其他内容不要输出!
+            #输出要求#
+            输出每个评价标准角度的“等级”和作业的综合性“评语”。
+            “评语”控制在150字左右。
+            评价标准要按原样输出,严格按照输出格式输出json格式。只输出json格式的内容,其他内容不要输出!
 
-        #输出格式#
+            #输出格式#
 
-        [${text}{'comment':'评语(150个汉字左右)'}]
-        `;
+            [${text}{'comment':'评语(150个汉字左右)'}]
+            `;
+        }
+
+
+        
 
         let mk = `markSco${toolIndex}${i}`;
         let mkAwit = this.$refs[mk][0].aiupdetaSco(
@@ -21964,6 +22038,9 @@ export default {
                 } else if (_chapterData[this.taskCount][0].type == 6) {
                   this.showType = 1;
                   this.text = this.textList[this.taskCount][0];
+                } else if (_chapterData[this.taskCount][0].type == 16) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -22130,6 +22207,9 @@ export default {
                 } else if (_chapterData[this.taskCount][0].type == 6) {
                   this.showType = 1;
                   this.text = this.textList[this.taskCount][0];
+                } else if (_chapterData[this.taskCount][0].type == 16) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -24616,59 +24696,60 @@ export default {
       };
       x.send();
     },
-    downloadFile(url) {
-      let hz = url.substring(url.lastIndexOf(".") + 1);
+    downloadFile(url,uid) {
+      if (this.tType == 1 || this.userid == uid) {
+        let hz = url.substring(url.lastIndexOf(".") + 1);
 
-      if (hz == "txt" || hz == "md") {
-        this.lookTxt(url);
-        return;
-      }
+        if (hz == "txt" || hz == "md") {
+          this.lookTxt(url);
+          return;
+        }
 
-      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 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;
+        }
+        const loading2 = this.$loading.service({
+          background: "rgba(255, 255, 255, 0.7)",
+          target: document.body,
+          text: "文件加载中..."
+        });
+        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) {
+          loading2.close();
+          if (err) console.log(err, err.stack);
+          // an error occurred
+          else {
+            let url = window.URL.createObjectURL(new Blob([data.Body]));
+            let a = document.createElement("a");
+            a.name = name;
+            a.href = url;
+            a.download = name;
+            a.click();
+            console.log(data);
+          } // sxuccessful response
+        });
       }
-      const loading2 = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中..."
-      });
-      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) {
-        loading2.close();
-        if (err) console.log(err, err.stack);
-        // an error occurred
-        else {
-          let url = window.URL.createObjectURL(new Blob([data.Body]));
-          let a = document.createElement("a");
-          a.name = name;
-          a.href = url;
-          a.download = name;
-          a.click();
-          console.log(data);
-        } // sxuccessful response
-      });
-
       return;
       let _this = this;
       let _url = "";
@@ -26119,7 +26200,42 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              // 纯文本,整体渲染
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                   val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -30842,4 +30958,19 @@ div::-webkit-scrollbar {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+.pb_content >>> .katex {
+  font-size: 16px;
+  display: block;
+  width: 100%;
+  white-space: normal;
+}
+.pb_content >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
+
+.pb_content >>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
+}
 </style>

+ 151 - 89
src/components/easy3/studyStudent.vue

@@ -537,9 +537,9 @@
                   v-html="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail
-                      ? chapInfoList[courseType].chapterInfo[0].taskJson[
+                      ? renderedFormula(chapInfoList[courseType].chapterInfo[0].taskJson[
                           taskCount
-                        ].taskDetail
+                        ].taskDetail)
                       : '暂无描述'
                   "
                 ></div>
@@ -1021,7 +1021,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">电子白板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1033,7 +1033,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">思维导图</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1054,7 +1054,7 @@
                             />
                             <div style="margin: 5px 0">思维网格</div>
                             <!-- && worksStudent[toolIndex].length>0 -->
-														<div class="upload_toolBtn"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
+														<div class="upload_toolBtn" v-if="tType == 1"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1090,7 +1090,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问卷调查</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
                             style="position: absolute;right: 153px;top: -30px;">
                               分析
                             </div>
@@ -1107,7 +1107,7 @@
                             />
                             <div style="margin: 5px 0">选择题</div>
 
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,45)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,45)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1136,7 +1136,7 @@
                             />
                             <div style="margin: 5px 0">问答</div>
 
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
                               style="position: absolute;right: 135px;top: -45px;height: 40px;display: flex;align-items: center;justify-content: center;background: #409EFF;">
                               分析
                             </div>
@@ -1156,7 +1156,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">训练服务器</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1184,7 +1184,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AIoT Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1204,7 +1204,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Python</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1216,7 +1216,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1236,7 +1236,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">数学画板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1248,7 +1248,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">翻译</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1276,7 +1276,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">GeoGebra</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1288,7 +1288,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">源码编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
                               style="position: absolute;right: 153px;top: -42px;">
                               分析
                             </div>
@@ -1306,7 +1306,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">个人评价</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1318,7 +1318,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">选择匹配</div>
-														<div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
+														<div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1338,7 +1338,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">排序</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1350,7 +1350,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">表格</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1362,7 +1362,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">文档</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1374,7 +1374,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">学生分组</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1386,7 +1386,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">CocoPi</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1438,7 +1438,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">海龟编程</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1450,7 +1450,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI智能体</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1475,7 +1475,7 @@
                                 {{tool.appJson && tool.appJson.name ? tool.appJson.name : '应用中心'}}
                               </div>
                             </el-tooltip>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1495,7 +1495,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">公式编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1527,7 +1527,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语写作</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1539,7 +1539,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语口语</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1551,7 +1551,7 @@
                       <!-- <div class="toolTitle">工具描述</div> -->
                       <!-- @click.stop="updateToolDetail(toolIndex, 2)" 点击开启修改-->
                       <div style="height:100%;"
-                        v-html="contentConvent(tool.toolDetail)"
+                        v-html="renderedFormula(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
@@ -1738,7 +1738,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -1812,7 +1812,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -1886,7 +1886,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -2875,7 +2875,7 @@
                               <img
                                 style="cursor: pointer"
                                 :src="word2"
-                                @click="downloadFile(w.works)"
+                                @click="downloadFile(w.works,w.userid)"
                                 alt
                               />
                               <!--  @click="openVideo(w.works)" -->
@@ -3128,7 +3128,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <!--  @click="openVideo(w.works)" -->
@@ -3442,7 +3442,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -3603,7 +3603,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -4457,7 +4457,7 @@
                           <div
                             style="
                               width: calc(100% - 130px);
-                              display: block;
+                              display: flex;
                               white-space: nowrap;
                               overflow: hidden;
                               text-overflow: ellipsis;
@@ -6637,13 +6637,17 @@
                       tool.tool.indexOf(47) != -1
                     "
                   >
-                    <AnswerData
+                    <!-- <AnswerData
                       v-if="
                         checkJson[toolIndex].length &&
                         (tool.sentenceList || tool.sentenceList.length > 0)
                       "
                       :people="checkJson[toolIndex]"
-                    ></AnswerData>
+                    ></AnswerData> -->
+                    <sortToolWorkShow  v-if="
+                        worksStudent[toolIndex].length
+                      "
+                      :people="worksStudent[toolIndex]"></sortToolWorkShow>
                   </div>
                   <div
                     v-if="
@@ -7491,7 +7495,7 @@
                                 <img
                                   style="cursor: pointer"
                                   :src="word2"
-                                  @click="downloadFile(w.works)"
+                                  @click="downloadFile(w.works,w.userid)"
                                   alt
                                 />
                                 <!--  @click="openVideo(w.works)" -->
@@ -9649,7 +9653,7 @@
             :key="index1"
           >
             <div class="a_add_head">
-              <div style="display: flex">
+              <div style="display: flex;align-items: center;">
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
@@ -9663,7 +9667,7 @@
                 >
                   (多选题)
                 </div>
-                <div>题目:{{ testJson.testJson[index1].teststitle }}</div>
+                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -12579,6 +12583,7 @@ import AskStatic from "../components/askStatic";
 import AskStatic2 from "../components/askStatic2";
 import AnswerData2 from "../components/answerData2";
 import AnswerData from "../components/answerData";
+import sortToolWorkShow from "../components/sortToolWorkShow.vue";
 import EditorBar from "../tools/wangEnduit.vue";
 import Table from "../tools/table.vue";
 import Time from "../tools/time.vue";
@@ -12686,6 +12691,7 @@ export default {
     SeeBoard,
     AnswerData2,
     AnswerData,
+    sortToolWorkShow,
     Audio,
     ImgDraw,
     Table,
@@ -17528,6 +17534,9 @@ export default {
                 } else if (_chapterData[taskCount][0].type == 6) {
                   this.showType = 1;
                   this.text = this.textList[taskCount][0];
+                } else if (_chapterData[taskCount][0].type == 16) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -17695,6 +17704,9 @@ export default {
                 } else if (_chapterData[taskCount][0].type == 6) {
                   this.showType = 1;
                   this.text = this.textList[taskCount][0];
+                } else if (_chapterData[taskCount][0].type == 16) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -20091,49 +20103,52 @@ export default {
       };
       x.send();
     },
-    downloadFile(url) {
-      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;
+    downloadFile(url,uid) {
+      if (this.tType == 1 || this.userid == uid) {
+        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;
+        }
+        const loading2 = this.$loading.service({
+          background: "rgba(255, 255, 255, 0.7)",
+          target: document.body,
+          text: "文件加载中...",
+        });
+        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) {
+          loading2.close();
+          if (err) console.log(err, err.stack); // an error occurred
+          else {
+            let url = window.URL.createObjectURL(new Blob([data.Body]));
+            let a = document.createElement("a");
+            a.name = name;
+            a.href = url;
+            a.download = name;
+            a.click();
+            console.log(data);
+          }          // sxuccessful response
+
+        });
       }
-      const loading2 = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中...",
-      });
-      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) {
-        loading2.close();
-        if (err) console.log(err, err.stack); // an error occurred
-        else {
-          let url = window.URL.createObjectURL(new Blob([data.Body]));
-          let a = document.createElement("a");
-          a.name = name;
-          a.href = url;
-          a.download = name;
-          a.click();
-          console.log(data);
-        }          // sxuccessful response
 
-      });
 
       return;
       let _this = this;
@@ -21542,7 +21557,42 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+              // 纯文本,整体渲染
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -21561,7 +21611,7 @@ export default {
           ? c
               .replaceAll(/\r\n/g, "<br/>")
               .replaceAll(/\n/g, "<br/>")
-              .replaceAll(/\s/g, " &nbsp")
+              .replaceAll(/\s/g, "&nbsp")
           : "";
       };
     },
@@ -22010,7 +22060,21 @@ export default {
   overflow:hidden;
   box-sizing:border-box;
 }
+.pb_content >>> .katex {
+  font-size: 16px;
+  display: block;
+  width: 100%;
+  white-space: normal;
+}
+.pb_content >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
 
+.pb_content >>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
+}
 .file {
   display: flex;
   flex-direction: column;
@@ -24319,9 +24383,7 @@ export default {
   display: flex;
   align-items: center;
 }
-.tool_right_box >>> .katex {
-  font-size: 16px;
-}
+
 .tool_right_box + .tool_right_box {
   margin-top: 10px;
 }

+ 150 - 88
src/components/studyStudent.vue

@@ -500,9 +500,9 @@
                   v-html="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail
-                      ? chapInfoList[courseType].chapterInfo[0].taskJson[
+                      ? renderedFormula(chapInfoList[courseType].chapterInfo[0].taskJson[
                           taskCount
-                        ].taskDetail
+                        ].taskDetail)
                       : '暂无描述'
                   "
                 ></div>
@@ -981,7 +981,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">电子白板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -993,7 +993,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">思维导图</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1014,7 +1014,7 @@
                             />
                             <div style="margin: 5px 0">思维网格</div>
                             <!-- && worksStudent[toolIndex].length>0 -->
-														<div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
+														<div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1050,7 +1050,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问卷调查</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
                             style="position: absolute;right: 153px;top: -30px;">
                               分析
                             </div>
@@ -1068,7 +1068,7 @@
                             />
                             <div style="margin: 5px 0">选择题</div>
 
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,45)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,45)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1096,7 +1096,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问答</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
                               style="position: absolute;right: 135px;top: -45px;height: 40px;display: flex;align-items: center;justify-content: center;background: #409EFF;">
                               分析
                             </div>
@@ -1116,7 +1116,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">训练服务器</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1144,7 +1144,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AIoT Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1164,7 +1164,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Python</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1176,7 +1176,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1196,7 +1196,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">数学画板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1208,7 +1208,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">翻译</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1236,7 +1236,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">GeoGebra</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1248,7 +1248,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">源码编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
                               style="position: absolute;right: 153px;top: -42px;">
                               分析
                             </div>
@@ -1266,7 +1266,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">个人评价</div>
-														<div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
+														<div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1278,7 +1278,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">选择匹配</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1298,7 +1298,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">排序</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1310,7 +1310,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">表格</div>
-														<div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
+														<div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1322,7 +1322,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">文档</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1334,7 +1334,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">学生分组</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1346,7 +1346,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">CocoPi</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1398,7 +1398,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">海龟编程</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1410,7 +1410,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI智能体</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1434,7 +1434,7 @@
                               <div class="Ovh">
                                 {{tool.appJson && tool.appJson.name ? tool.appJson.name : '应用中心'}}
                               </div>
-                              <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
+                              <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1455,7 +1455,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">公式编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1487,7 +1487,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语写作</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1499,7 +1499,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语口语</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1511,7 +1511,7 @@
                       <!-- <div class="toolTitle">工具描述</div> -->
                         <!-- @click.stop="updateToolDetail(toolIndex, 2)" -->
                       <div style="height:100%;"
-                        v-html="contentConvent(tool.toolDetail)"
+                        v-html="renderedFormula(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
@@ -1698,7 +1698,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -1772,7 +1772,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -1846,7 +1846,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -2835,7 +2835,7 @@
                               <img
                                 style="cursor: pointer"
                                 :src="word2"
-                                @click="downloadFile(w.works)"
+                                @click="downloadFile(w.works,w.userid)"
                                 alt
                               />
                               <!--  @click="openVideo(w.works)" -->
@@ -3088,7 +3088,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <!--  @click="openVideo(w.works)" -->
@@ -3402,7 +3402,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -3563,7 +3563,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -4417,7 +4417,7 @@
                           <div
                             style="
                               width: calc(100% - 130px);
-                              display: block;
+                              display: flex;
                               white-space: nowrap;
                               overflow: hidden;
                               text-overflow: ellipsis;
@@ -6597,13 +6597,17 @@
                       tool.tool.indexOf(47) != -1
                     "
                   >
-                    <AnswerData
+                    <!-- <AnswerData
                       v-if="
                         checkJson[toolIndex].length &&
                         (tool.sentenceList || tool.sentenceList.length > 0)
                       "
                       :people="checkJson[toolIndex]"
-                    ></AnswerData>
+                    ></AnswerData> -->
+                     <sortToolWorkShow  v-if="
+                        worksStudent[toolIndex].length
+                      "
+                      :people="worksStudent[toolIndex]"></sortToolWorkShow>
                   </div>
                   <div
                     v-if="
@@ -7451,7 +7455,7 @@
                                 <img
                                   style="cursor: pointer"
                                   :src="word2"
-                                  @click="downloadFile(w.works)"
+                                  @click="downloadFile(w.works,w.userid)"
                                   alt
                                 />
                                 <!--  @click="openVideo(w.works)" -->
@@ -9585,7 +9589,7 @@
             :key="index1"
           >
             <div class="a_add_head">
-              <div style="display: flex">
+              <div style="display: flex;align-items: center;">
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
@@ -9599,7 +9603,7 @@
                 >
                   (多选题)
                 </div>
-                <div>题目:{{ testJson.testJson[index1].teststitle }}</div>
+                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -12518,6 +12522,7 @@ import AskStatic from "./components/askStatic";
 import AskStatic2 from "./components/askStatic2";
 import AnswerData2 from "./components/answerData2";
 import AnswerData from "./components/answerData";
+import sortToolWorkShow from "./components/sortToolWorkShow.vue";
 import EditorBar from "./tools/wangEnduit.vue";
 import Table from "./tools/table.vue";
 import Time from "./tools/time.vue";
@@ -12623,6 +12628,7 @@ export default {
     SeeBoard,
     AnswerData2,
     AnswerData,
+    sortToolWorkShow,
     Audio,
     ImgDraw,
     Table,
@@ -17469,6 +17475,9 @@ export default {
                 } else if (_chapterData[this.taskCount][0].type == 6) {
                   this.showType = 1;
                   this.text = this.textList[this.taskCount][0];
+                } else if (_chapterData[this.taskCount][0].type == 16) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -17635,6 +17644,9 @@ export default {
                 } else if (_chapterData[this.taskCount][0].type == 6) {
                   this.showType = 1;
                   this.text = this.textList[this.taskCount][0];
+                } else if (_chapterData[this.taskCount][0].type == 16) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -20028,51 +20040,52 @@ export default {
       };
       x.send();
     },
-    downloadFile(url) {
-			// this.$message.info("查看作业-下载文件")
-      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;
-      }
-      const loading2 = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中...",
-      });
-      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) {
-        loading2.close();
-        if (err) console.log(err, err.stack); // an error occurred
-        else {
-          let url = window.URL.createObjectURL(new Blob([data.Body]));
-          let a = document.createElement("a");
-          a.name = name;
-          a.href = url;
-          a.download = name;
-          a.click();
-          console.log(data);
-        }          // sxuccessful response
-
-      });
+    downloadFile(url,uid) {
+      if (this.tType == 1 || this.userid == uid) {
+        // this.$message.info("查看作业-下载文件")
+        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;
+        }
+        const loading2 = this.$loading.service({
+          background: "rgba(255, 255, 255, 0.7)",
+          target: document.body,
+          text: "文件加载中...",
+        });
+        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) {
+          loading2.close();
+          if (err) console.log(err, err.stack); // an error occurred
+          else {
+            let url = window.URL.createObjectURL(new Blob([data.Body]));
+            let a = document.createElement("a");
+            a.name = name;
+            a.href = url;
+            a.download = name;
+            a.click();
+            console.log(data);
+          }          // sxuccessful response
 
+        });
+      }
       return;
       let _this = this;
       let _url = "";
@@ -21496,7 +21509,41 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              // 纯文本,整体渲染
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -26145,4 +26192,19 @@ div::-webkit-scrollbar {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+.pb_content >>> .katex {
+  font-size: 16px;
+  display: block;
+  width: 100%;
+  white-space: normal;
+}
+.pb_content >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
+
+.pb_content >>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
+}
 </style>

+ 247 - 120
src/components/studySutdentClass/studyStudent.vue

@@ -537,9 +537,9 @@
                   v-html="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail
-                      ? chapInfoList[courseType].chapterInfo[0].taskJson[
+                      ? renderedFormula(chapInfoList[courseType].chapterInfo[0].taskJson[
                           taskCount
-                        ].taskDetail
+                        ].taskDetail)
                       : '暂无描述'
                   "
                 ></div>
@@ -1020,7 +1020,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">电子白板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1032,7 +1032,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">思维导图</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1053,7 +1053,7 @@
                             />
                             <div style="margin: 5px 0">思维网格</div>
                             <!-- && worksStudent[toolIndex].length>0 -->
-                            <div class="upload_toolBtn"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
+                            <div class="upload_toolBtn" v-if="tType == 1"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1089,7 +1089,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问卷调查</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
                             style="position: absolute;right: 153px;top: -30px;">
                               分析
                             </div>
@@ -1119,7 +1119,7 @@
                             <!-- &&worksStudent[toolIndex].length > 0 -->
                             <div
                               class="upload_toolBtn"
-
+                              v-if="tType == 1"
                               @click="
                                 openChoseWorksDetailDialog(
                                   tooC,
@@ -1155,7 +1155,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问答</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
                               style="position: absolute;right: 135px;top: -45px;height: 40px;display: flex;align-items: center;justify-content: center;background: #409EFF;">
                               分析
                             </div>
@@ -1175,7 +1175,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">训练服务器</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1203,7 +1203,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AIoT Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1231,7 +1231,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1251,7 +1251,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">数学画板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1263,7 +1263,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">翻译</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1291,7 +1291,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">GeoGebra</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1303,7 +1303,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">源码编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
                               style="position: absolute;right: 153px;top: -42px;">
                               分析
                             </div>
@@ -1321,7 +1321,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">个人评价</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1333,7 +1333,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">选择匹配</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1353,7 +1353,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">排序</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
+														<div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1365,7 +1365,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">表格</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1377,7 +1377,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">文档</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1389,7 +1389,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">学生分组</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1401,7 +1401,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">CocoPi</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1453,7 +1453,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">海龟编程</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1465,7 +1465,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI智能体</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1490,7 +1490,7 @@
                                 {{tool.appJson && tool.appJson.name ? tool.appJson.name : '应用中心'}}
                               </div>
                             </el-tooltip>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1510,7 +1510,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">公式编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,36)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,36)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1542,7 +1542,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语写作</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1554,7 +1554,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语口语</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1573,7 +1573,7 @@
                       <!-- @click.stop="updateToolDetail(toolIndex, 2)" -->
                       <div
                         style="height:100%;"
-                        v-html="contentConvent(tool.toolDetail)"
+                        v-html="renderedFormula(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
@@ -1964,7 +1964,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -2102,7 +2102,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -2176,7 +2176,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -3443,7 +3443,7 @@
                               <img
                                 style="cursor: pointer"
                                 :src="word2"
-                                @click="downloadFile(w.works)"
+                                @click="downloadFile(w.works,w.userid)"
                                 alt
                               />
                               <!--  @click="openVideo(w.works)" -->
@@ -3987,7 +3987,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <!--  @click="openVideo(w.works)" -->
@@ -4427,7 +4427,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -4605,7 +4605,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -6194,7 +6194,7 @@
                           <div
                             style="
                               width: calc(100% - 130px);
-                              display: block;
+                              display: flex;
                               white-space: nowrap;
                               overflow: hidden;
                               text-overflow: ellipsis;
@@ -9274,13 +9274,17 @@
                         tool.tool.indexOf(47) != -1
                     "
                   >
-                    <AnswerData
+                    <!-- <AnswerData
                       v-if="
                         checkJson[toolIndex].length &&
                           (tool.sentenceList || tool.sentenceList.length > 0)
                       "
                       :people="checkJson[toolIndex]"
-                    ></AnswerData>
+                    ></AnswerData> -->
+                    <sortToolWorkShow  v-if="
+                        worksStudent[toolIndex].length
+                      "
+                      :people="worksStudent[toolIndex]"></sortToolWorkShow>
                   </div>
                   <div
                     v-if="
@@ -10660,7 +10664,7 @@
                                 <img
                                   style="cursor: pointer"
                                   :src="word2"
-                                  @click="downloadFile(w.works)"
+                                  @click="downloadFile(w.works,w.userid)"
                                   alt
                                 />
                                 <!--  @click="openVideo(w.works)" -->
@@ -12213,7 +12217,7 @@
                   alt
                 />
                 <div style="margin: 5px 0">AI Python</div>
-                <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
+                <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
                   style="position: absolute;right: 33px;top: -30px;">
                   分析
                 </div>
@@ -12830,7 +12834,7 @@
             :key="index1"
           >
             <div class="a_add_head">
-              <div style="display: flex">
+              <div style="display: flex;align-items: center;">
                 <span class="askIndex">{{ index1 + 1 }}</span>
                 <div
                   v-if="testJson.testJson[index1].type == '1'"
@@ -12844,7 +12848,7 @@
                 >
                   (多选题)
                 </div>
-                <div>题目:{{ testJson.testJson[index1].teststitle }}</div>
+                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -15824,6 +15828,7 @@ import AskStatic from "../components/askStatic";
 import AskStatic2 from "../components/askStatic2";
 import AnswerData2 from "../components/answerData2";
 import AnswerData from "../components/answerData";
+import sortToolWorkShow from "../components/sortToolWorkShow.vue";
 import EditorBar from "../tools/wangEnduit.vue";
 import Table from "../tools/table.vue";
 import Time from "../tools/time.vue";
@@ -15855,9 +15860,9 @@ import MarkdownIt from "markdown-it";
 import statisticalAnalysis from '../components/statisticalAnalysis.vue'
 import choseWorksDetailDialog from '../components/choseWorksDetailDialog.vue'
 import { v4 as uuidv4 } from "uuid";
-import markScore from "./commpont/markScore";
-import markDialog from "./commpont/markDialog";
-import evaTable from "./commpont/evaTable";
+import markScore from "../easy2/commpont/markScore";
+import markDialog from "../easy2/commpont/markDialog";
+import evaTable from "../easy2/commpont/evaTable";
 import choseWordCloud from '../components/choseWordCloud.vue'
 import appStoreC from "../components/appStoreC.vue";
 import cocoFlowDia from "../components/cocoFlowDia.vue";
@@ -15934,6 +15939,7 @@ export default {
     SeeBoard,
     AnswerData2,
     AnswerData,
+    sortToolWorkShow,
     Audio,
     ImgDraw,
     Table,
@@ -16656,38 +16662,102 @@ export default {
           this.AIloading[toolIndex][i].loading = false;
           continue;
         }
-        let msg = `NOTICE
-        Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
-        Language: ${this.getLang()}
-        ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
-        Instruction: Based on the context, follow "Format example", write content.
-
-        #目标#
-        你要根据“六级评价细则”点评学生作品,并生成需要的JSON数据。
-        你要根据<评价细则>和<作业内容>的相关性评价作业,判断该作业属于六级中的哪个等级。
-        你要结合<评价标准><评价细则>和<你判断的等级>写评语。
-        如果作业内容与评价细则无关,则直接评为0星。如果作业内容与<任务描述>或<工具描述>一致或者相似,则直接评为0星,并输出评语“期待看到你自己的想法!必要时,可以请教老师哦~”
-        ${con[i].type == 0 ? "提取图片内容进行评价" : ""}
+        let msg = ''
+        if(con[i].type == 20){
+           msg = `#NOTICE#
+                  Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
+            - 深入理解教育评价标准,准确判断对话内容是否符合要求。
+            - 具备较强的文本分析能力,从对话中有效提取评价相关信息。
+            - 拥有客观公正的态度,确保评分结果公平合理。
+            - 能够清晰准确地表达评语,使学生和教师易于理解。
+            - 熟悉各类学习作业的要求和重点,为评价提供依据。
+            - 掌握一定的教育教学知识,更好地分析对话在教育场景中的意义。 
+                  Language: ${this.getLang()}
+                  ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
+                  Instruction: Based on the context, follow "Format example", write content.
+
+                  #目标#
+                  你要结合<作业内容><评价标准>和该标准对应的<等级>写评语。
+            ${con[i].type == 0 ? "提取图片内容进行评价" : ""} 
+                  #评分资料#
+                  评价标准:${std}
+                  评价细则:${laws}
+                  等级:${text}
+                  作业内容:${_fileid ? "上传的文件内容" : con[i].works}
+          具体你步骤如下:
+          1. 作业内容审查:仔细阅读需要评价的作业内容,标记出可能与评价相关的部分,如知识点的回答准确性、回答的完整性、语言表达的规范性等。
+          2. 掌握评价标准:阅读理解并掌握评价标准的结构与内容,包括评价维度、不同等级以及对应的评价细则的内容为评价标准。
+          3. 评分计算:针对提取的作业内容按照确定的评价标准,对标记出的评价相关部分进行量化打分,输出评分结果。
+          4. 评语生成:根据评分结果和对话中的具体情况,撰写评语,指出优点和不足之处,以帮助学生自查作业并为教师提供评价和指导依据。
+
+          ### 理论框架
+          ### 教育目标分类理论
+          1. 基本原理:
+          - 将教育目标按照不同的层次分类,如认知领域、情感领域和动作技能领域等。
+          - 有助于明确教学活动期望达成的目标类型。
+          - 为评价教学成果提供了分类框架。
+          2. 具体应用:
+          - 分析对话中涉及的目标类型,判断是否符合预期的教育目标。
+          - 依据不同目标类型的要求,评估对话对学生相应能力的促进作用。
+          - 对比不同对话内容在目标达成度上的差异进行评分。
+
+          ### 教学评价理论
+          1. 基本原理:
+          - 关注教学过程和结果的评价,包括对教师教学行为和学生学习成果的评价。
+          - 从多个维度进行评价,如教学内容、教学方法、学习效果等。
+          - 强调评价的客观性、全面性和发展性。
+          2. 具体应用:
+          - 从对话中提取与教学内容、方法相关的信息进行评价。
+          - 考量对话对学生学习效果的影响来给出评分。
+          - 根据评价结果提出改进和发展的建议。
+
+          ### 对话分析理论
+          1. 基本原理:
+          - 着重对对话结构、话语功能、交互模式等进行分析。
+          - 揭示对话中的信息流动、话语权分配等情况。
+          - 有助于理解对话参与者之间的关系和互动效果。
+          2. 具体应用:
+          - 剖析“小可ai助手”与学生对话的结构合理性。
+          - 分析话语功能是否有助于学习和评价目的。
+          - 根据交互模式判断对话是否有利于学生参与和学习,从而给出评分。
+              
+          #输出格式#
+
+          [${text}{'comment':'评语(150个汉字左右)'}]
+          注意检查输出评语不超过50字`
+        }else{
+          msg = `NOTICE
+            Role: 你是一个资深的教师,你有丰富的项目式学习、跨学科学习、STEAM导师经验,你要对学生的评价高度负责。
+            Language: ${this.getLang()}
+            ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced the "Format example".
+            Instruction: Based on the context, follow "Format example", write content.
 
+            #目标#
+            你要根据“六级评价细则”点评学生作品,并生成需要的JSON数据。
+            你要根据<评价细则>和<作业内容>的相关性评价作业,判断该作业属于六级中的哪个等级。
+            你要结合<评价标准><评价细则>和<你判断的等级>写评语。
+            如果作业内容与评价细则无关,则直接评为0星。如果作业内容与<任务描述>或<工具描述>一致或者相似,则直接评为0星,并输出评语“期待看到你自己的想法!必要时,可以请教老师哦~”
+            ${con[i].type == 0 ? "提取图片内容进行评价" : ""}
 
-        #评分资料#
-        评价标准:${std}
-        评价细则:${laws}
-        作业内容:${_fileid ? "上传的文件内容" : JSON.parse(con[i].works).text}
-        任务描述:${taskDetail}
-        工具描述:${toolDetail}
 
+            #评分资料#
+            评价标准:${std}
+            评价细则:${laws}
+            作业内容:${_fileid ? "上传的文件内容" : JSON.parse(con[i].works).text}
+            任务描述:${taskDetail}
+            工具描述:${toolDetail}
 
-        #输出要求#
-        输出每个评价标准角度的“等级”和作业的综合性“评语”。
-        “评语”控制在150字左右。
-        评价标准要按原样输出,严格按照输出格式输出json格式。只输出json格式的内容,其他内容不要输出!
 
-        #输出格式#
+            #输出要求#
+            输出每个评价标准角度的“等级”和作业的综合性“评语”。
+            “评语”控制在150字左右。
+            评价标准要按原样输出,严格按照输出格式输出json格式。只输出json格式的内容,其他内容不要输出!
 
-        [${text}{'comment':'评语(150个汉字左右)'}]
-        `;
+            #输出格式#
 
+            [${text}{'comment':'评语(150个汉字左右)'}]
+            `;
+        }
         let mk = `markSco${toolIndex}${i}`;
         let mkAwit = this.$refs[mk][0].aiupdetaSco(
           msg,
@@ -21424,6 +21494,9 @@ export default {
                 } else if (_chapterData[taskCount][0].type == 6) {
                   this.showType = 1;
                   this.text = this.textList[taskCount][0];
+                } else if (_chapterData[taskCount][0].type == 16) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -21591,6 +21664,9 @@ export default {
                 } else if (_chapterData[taskCount][0].type == 6) {
                   this.showType = 1;
                   this.text = this.textList[taskCount][0];
+                } else if (_chapterData[taskCount][0].type == 16) {
+                  this.showType = 16;
+                  this.pptImgUrl1 = _url;
                 }
               }
             }
@@ -24061,56 +24137,57 @@ export default {
       };
       x.send();
     },
-    downloadFile(url) {
-      let hz = url.substring(url.lastIndexOf(".") + 1);
+    downloadFile(url,uid) {
+      if (this.tType == 1 || this.userid == uid) {
+        let hz = url.substring(url.lastIndexOf(".") + 1);
 
-      if (hz == "txt" || hz == "md") {
-        this.lookTxt(url);
-        return;
-      }
-      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;
-      }
-      const loading2 = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中...",
-      });
-      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) {
-        loading2.close();
-        if (err) console.log(err, err.stack); // an error occurred
-        else {
-          let url = window.URL.createObjectURL(new Blob([data.Body]));
-          let a = document.createElement("a");
-          a.name = name;
-          a.href = url;
-          a.download = name;
-          a.click();
-          console.log(data);
-        }          // sxuccessful response
-
-      });
+        if (hz == "txt" || hz == "md") {
+          this.lookTxt(url);
+          return;
+        }
+        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;
+        }
+        const loading2 = this.$loading.service({
+          background: "rgba(255, 255, 255, 0.7)",
+          target: document.body,
+          text: "文件加载中...",
+        });
+        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) {
+          loading2.close();
+          if (err) console.log(err, err.stack); // an error occurred
+          else {
+            let url = window.URL.createObjectURL(new Blob([data.Body]));
+            let a = document.createElement("a");
+            a.name = name;
+            a.href = url;
+            a.download = name;
+            a.click();
+            console.log(data);
+          }          // sxuccessful response
 
+        });
+      }
       return;
       let _this = this;
       let _url = "";
@@ -25519,7 +25596,42 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              // 纯文本,整体渲染
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -30199,4 +30311,19 @@ div::-webkit-scrollbar {
 
   text-overflow: ellipsis;
 }
+.pb_content >>> .katex {
+  font-size: 16px;
+  display: block;
+  width: 100%;
+  white-space: normal;
+}
+.pb_content >>> .katex .base{
+  display: inline !important;
+  display: contents !important;
+}
+
+.pb_content >>> .katex .base .cjk_fallback{
+    white-space: normal !important;
+    display: inline !important;
+}
 </style>

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov