Browse Source

Merge branch 'beta'

SanHQin 1 week ago
parent
commit
c5546f2f22

+ 1 - 1
dist/index.html

@@ -27,7 +27,7 @@
     html,
     body{
       font-family: '黑体';
-    }</style><link href=./static/css/app.4390469f408660c3ae79f261bf69c88c.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.44c91e92254f017d3b21.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() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

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


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


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


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


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


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


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


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


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


+ 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;

+ 54 - 6
src/components/components/choseWorksDetailDialog.vue

@@ -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,6 +1040,7 @@
                     </svg>
 
                     <span
+                    style="display: flex;align-items: center;"
                       >{{
                         typeof item.answer === "number"
                           ? "单选题:"
@@ -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>

+ 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>

+ 52 - 4
src/components/components/studentWorkPreviewDialog.vue

@@ -37,6 +37,7 @@
                   </svg>
 
                   <span
+                    style="display: flex;align-items: center;"
                     >{{ item.type == 1 ? "单选题:" : "多选题:"
                     }}<span v-html="renderedFormula(item.teststitle)"></span> </span
                   >
@@ -401,8 +402,42 @@ export default {
   computed: {
     renderedFormula() {
       return function(val){
-        try {
-          return katex.renderToString(val,{ throwOnError: false });
+       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;
@@ -473,8 +508,21 @@ export default {
   width: 100vw;
   overflow: auto;
 }
-.studentWorkPreviewDialog >>> .katex{
-  font-size: 20px;
+
+.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%;

+ 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})
                   

+ 123 - 31
src/components/easy2/studyStudent.vue

@@ -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="
@@ -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'"
@@ -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;
                 }
               }
             }
@@ -30880,5 +30960,17 @@ div::-webkit-scrollbar {
 }
 .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>

+ 29 - 7
src/components/easy3/studyStudent.vue

@@ -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="
@@ -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'"
@@ -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;
                 }
               }
             }
@@ -22050,6 +22062,18 @@ export default {
 }
 .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;
@@ -24359,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;
 }

+ 28 - 4
src/components/studyStudent.vue

@@ -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="
@@ -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'"
@@ -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;
                 }
               }
             }
@@ -26182,5 +26194,17 @@ div::-webkit-scrollbar {
 }
 .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>

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

@@ -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="
@@ -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'"
@@ -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;
                 }
               }
             }
@@ -30237,5 +30313,17 @@ div::-webkit-scrollbar {
 }
 .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>

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