Kaynağa Gözat

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

SanHQin 9 ay önce
ebeveyn
işleme
969bc9212c
51 değiştirilmiş dosya ile 24549 ekleme ve 2969 silme
  1. 2 0
      README.md
  2. 1 0
      build/webpack.dev.conf.js
  3. 1 1
      dist/index.html
  4. 0 0
      dist/static/css/app.73aec9ab0672645b6912b9fee4bd21bc.css
  5. 0 0
      dist/static/css/app.73aec9ab0672645b6912b9fee4bd21bc.css.map
  6. 0 0
      dist/static/css/app.baedc63e611da37a4eb4fb361a578224.css
  7. 0 0
      dist/static/css/app.baedc63e611da37a4eb4fb361a578224.css.map
  8. 0 0
      dist/static/img/videoFile.2273786.svg
  9. 0 0
      dist/static/js/0.62586bda94a1b515c352.js
  10. 0 0
      dist/static/js/0.62586bda94a1b515c352.js.map
  11. 0 0
      dist/static/js/0.7da288988865a9378b49.js.map
  12. 0 0
      dist/static/js/2.94e1427bfc7ef0b4c685.js.map
  13. 0 0
      dist/static/js/2.96e371dc7fcc92b785ca.js
  14. 0 0
      dist/static/js/2.96e371dc7fcc92b785ca.js.map
  15. 0 0
      dist/static/js/app.636bf500297fc81250bd.js
  16. 0 0
      dist/static/js/app.636bf500297fc81250bd.js.map
  17. 2 2
      dist/static/js/manifest.949266e941635483ba4e.js
  18. 0 0
      dist/static/js/manifest.949266e941635483ba4e.js.map
  19. 0 0
      dist/static/js/vendor.e1cf871eb7c38dbf5c5b.js
  20. 0 0
      dist/static/js/vendor.e1cf871eb7c38dbf5c5b.js.map
  21. 19234 1
      package-lock.json
  22. 3 1
      package.json
  23. 1015 435
      src/components/pages/aiAddCourse/addCourse.vue
  24. 26 47
      src/components/pages/aiAddCourse/aiCreateDialog.vue
  25. 1 1
      src/components/pages/aiAddCourse/aiCreateVideoDialog.vue
  26. 13 3
      src/components/pages/aiAddCourse/aiDialog.vue
  27. 776 699
      src/components/pages/classroomObservation/components/chatArea.vue
  28. 1 1
      src/components/pages/classroomObservation/components/mdView.vue
  29. 2045 946
      src/components/pages/classroomObservation/components/messageArea.vue
  30. 1 1
      src/components/pages/classroomObservation/components/pieChart.vue
  31. 665 706
      src/components/pages/classroomObservation/index.vue
  32. 66 14
      src/components/pages/components/worksDetail2.vue
  33. 1 1
      src/components/pages/course.vue
  34. 3 3
      src/components/pages/dataBoardNew/course/index.vue
  35. 3 3
      src/components/pages/dataBoardNew/project/chartList/bar/teacherStudent.vue
  36. 4 2
      src/components/pages/dataBoardNew/project/index.vue
  37. 2 2
      src/components/pages/dataBoardNew/student/index.vue
  38. 1 1
      src/components/pages/dataBoardNew/teacher/index.vue
  39. 2 2
      src/components/pages/library/fileBox.vue
  40. 1 1
      src/components/pages/test/add/edit/check/file.vue
  41. 5 0
      src/components/pages/test/add/edit/check/uploadFile.vue
  42. 6 1
      src/components/pages/test/add/setInfo/index.vue
  43. 208 23
      src/components/pages/test/aggregate/index.vue
  44. 180 17
      src/components/pages/test/check/index.vue
  45. 128 21
      src/components/pages/test/examine/conpoments/personPage.vue
  46. 87 22
      src/components/pages/test/examine/conpoments/targetPage.vue
  47. 7 2
      src/components/pages/test/examine/index.vue
  48. 7 3
      src/components/pages/test/shareBox/index.vue
  49. 30 4
      src/components/pages/testPerson/examine/index.vue
  50. 20 1
      src/components/pages/testPerson/test/test.vue
  51. 2 2
      src/components/pages/testStudent/view/component/file.vue

+ 2 - 0
README.md

@@ -1,2 +1,4 @@
 # pbl-teacher
 
+node ^12
+

+ 1 - 0
build/webpack.dev.conf.js

@@ -32,6 +32,7 @@ const devWebpackConfig = merge(baseWebpackConfig, {
     contentBase: false, // since we use CopyWebpackPlugin.
     compress: true,
     host: HOST || config.dev.host,
+    disableHostCheck: true,
     port: PORT || config.dev.port,
     open: config.dev.autoOpenBrowser,
     overlay: config.dev.errorOverlay

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.baedc63e611da37a4eb4fb361a578224.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.571c38d63f24b1ae9e16.js></script><script type=text/javascript src=./static/js/vendor.d5f0d79dbb0d92c052d4.js></script><script type=text/javascript src=./static/js/app.e12c9327b7b954504f6e.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.73aec9ab0672645b6912b9fee4bd21bc.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.949266e941635483ba4e.js></script><script type=text/javascript src=./static/js/vendor.e1cf871eb7c38dbf5c5b.js></script><script type=text/javascript src=./static/js/app.636bf500297fc81250bd.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/css/app.73aec9ab0672645b6912b9fee4bd21bc.css


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/css/app.73aec9ab0672645b6912b9fee4bd21bc.css.map


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/css/app.baedc63e611da37a4eb4fb361a578224.css


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/css/app.baedc63e611da37a4eb4fb361a578224.css.map


+ 0 - 0
dist/static/img/videoFile.8b2406f.svg → dist/static/img/videoFile.2273786.svg


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/0.62586bda94a1b515c352.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/0.62586bda94a1b515c352.js.map


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/0.7da288988865a9378b49.js.map


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/2.94e1427bfc7ef0b4c685.js.map


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/2.96e371dc7fcc92b785ca.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/2.96e371dc7fcc92b785ca.js.map


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/app.636bf500297fc81250bd.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/app.636bf500297fc81250bd.js.map


+ 2 - 2
dist/static/js/manifest.571c38d63f24b1ae9e16.js → dist/static/js/manifest.949266e941635483ba4e.js

@@ -1,2 +1,2 @@
-!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,a,c){for(var i,u,f,s=0,l=[];s<r.length;s++)u=r[s],t[u]&&l.push(t[u][0]),t[u]=0;for(i in a)Object.prototype.hasOwnProperty.call(a,i)&&(e[i]=a[i]);for(n&&n(r,a,c);l.length;)l.shift()();if(c)for(s=0;s<c.length;s++)f=o(o.s=c[s]);return f};var r={},t={6:0};function o(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,o){n=t[e]=[r,o]});n[2]=r;var a=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,o.nc&&c.setAttribute("nonce",o.nc),c.src=o.p+"static/js/"+e+"."+{0:"7da288988865a9378b49",1:"d8d4e9b1fe43bbb0a681",2:"94e1427bfc7ef0b4c685",3:"3a9f53a78da16650e6b8"}[e]+".js";var i=setTimeout(u,12e4);function u(){c.onerror=c.onload=null,clearTimeout(i);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return c.onerror=c.onload=u,a.appendChild(c),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="./",o.oe=function(e){throw console.error(e),e}}([]);
-//# sourceMappingURL=manifest.571c38d63f24b1ae9e16.js.map
+!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,a,c){for(var i,u,f,s=0,l=[];s<r.length;s++)u=r[s],t[u]&&l.push(t[u][0]),t[u]=0;for(i in a)Object.prototype.hasOwnProperty.call(a,i)&&(e[i]=a[i]);for(n&&n(r,a,c);l.length;)l.shift()();if(c)for(s=0;s<c.length;s++)f=o(o.s=c[s]);return f};var r={},t={6:0};function o(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,o){n=t[e]=[r,o]});n[2]=r;var a=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,o.nc&&c.setAttribute("nonce",o.nc),c.src=o.p+"static/js/"+e+"."+{0:"62586bda94a1b515c352",1:"d8d4e9b1fe43bbb0a681",2:"96e371dc7fcc92b785ca",3:"3a9f53a78da16650e6b8"}[e]+".js";var i=setTimeout(u,12e4);function u(){c.onerror=c.onload=null,clearTimeout(i);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return c.onerror=c.onload=u,a.appendChild(c),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="./",o.oe=function(e){throw console.error(e),e}}([]);
+//# sourceMappingURL=manifest.949266e941635483ba4e.js.map

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/manifest.949266e941635483ba4e.js.map


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/vendor.e1cf871eb7c38dbf5c5b.js


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
dist/static/js/vendor.e1cf871eb7c38dbf5c5b.js.map


Dosya farkı çok büyük olduğundan ihmal edildi
+ 19234 - 1
package-lock.json


+ 3 - 1
package.json

@@ -35,8 +35,10 @@
     "jszip": "^3.10.1",
     "lamejs": "^1.2.1",
     "language-hk-loader": "^1.0.1",
-    "markdown-it": "^14.1.0",
+    "lodash": "^4.17.21",
+    "markdown-it": "^13.0.2",
     "opencc-js": "^1.0.5",
+    "papaparse": "^5.4.1",
     "pdfjs-dist": "^2.5.207",
     "pptxgenjs": "^3.12.0",
     "qrcodejs2": "^0.0.2",

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1015 - 435
src/components/pages/aiAddCourse/addCourse.vue


+ 26 - 47
src/components/pages/aiAddCourse/aiCreateDialog.vue

@@ -241,79 +241,54 @@ Instruction: Based on the context, follow "Format example", write content.
 
 # Context 
 ## 任务
-将参考#大纲内容,为教师生成这节课的教学ppt。PPT的内容主要是讲解该课程中所有可能涉及到的知识点,根据大纲内容生成ppt内容。
+你会收到一节课的教学ppt大纲<大纲内容>,你需要细化大纲每个部分(除了测试题部分),生成详细每一页ppt的内容参考#每一页输出格式。 
 
-## 每一页输出格式
-- 页数:序列数字
-- 标题:学科概念(请从给你的大纲中摘取)
-- 子标题:知识点(请从给你的大纲中摘取)
-- 知识点讲解:针对大纲中的每个知识点,生成200字左右的详细讲解。你的语气应该让小学或初中的学生清晰易懂的讲解。你的讲解词在200 token左右。请尽可能的详细,这对我很重要。
-
-## 限制
-- 你不能输出错误的知识,如果你实在不清楚,修改大纲中的知识点。
-- 你不能输出违反伦理的内容
+# 目标
+生成教师可用直接拿来上课的ppt,ppt中用亲切的口吻告诉学生,他们该做什么,以及介绍相关的知识点(知识点需要详细的说明)。必要时使用bullet point。最终生成12页左右的ppt。
 
-## 工作流
-1. 针对大纲中的每个知识点,生成200字左右的详细讲解。你的语气应该让小学或初中的学生清晰易懂的讲解。请尽可能的详细,这对我很重要。
-2. 针对大纲中的每个测试,详细设计不同测试题目,例如单选,多选,对错题等。
-3.从用户提供的参考资料中提取5个最重要的学科概念,并输出。
-4.分解每个学科概念为几个子知识点
-5.简要描述每个知识点
-6.生成5个测试题以考察学生的掌握情况
-7.一个知识点一页,一个测试题一页
+# 每一页输出格式
+- 页数:序列数字
+- 标题:环节
+- 子标题:步骤或者知识点或测试题序号
+- 内容:用亲切的口吻告诉学生本步骤应做什么?或者是用亲切的口吻向学生介绍知识点,多条时可使用bullet point;或者是给学生测试题。
 
 ## 大纲内容
 ${_this.outline.replaceAll('#','').replaceAll('*','').replaceAll('-','').replaceAll('\n','')}
 
 # Format example
-[{"page": "页码(数字)","title": "学科概念(请从给你的大纲中摘取)(标题)","task": "知识点(请从给你的大纲中摘取)(子标题)","points": "知识点讲解:针对大纲中的每个知识点,生成200字左右的详细讲解。你的语气应该让小学或初中的学生清晰易懂的讲解。你的讲解词在100 token左右。请尽可能的详细,这对我很重要。"}]`;
+[{"page": "页码(数字)","title": "学科概念(请从给你的大纲中摘取)(标题)","task": "知识点(请从给你的大纲中摘取)(子标题)","points": "内容:用亲切的口吻告诉学生本步骤应做什么?或者是用亲切的口吻向学生介绍知识点,多条时可使用bullet point;或者是给学生测试题。"}]`;
             } else {
                 if(this.courseState == 4){
                     message = `# 任务
 请根据参考资料,生成关于${this.courseName},为教师生成这节课的教学ppt的大纲,大纲的主要内容课程知识点的讲解与相关练习和测试。你的输出应该符合#输出格式
 
-# 工作流
-1.从用户提供的参考资料中提取3个最重要的学科概念${mclass.length ? "(水平限制在{面向年级}中)" : ""},并输出。
-2.分解每个学科概念为几个子知识点
-3.简要描述每个知识点
-4.生成3个测试题以考察学生的掌握情况
-
 ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
 
 # 输出格式
-- 标题:学科概念1
-  1.知识点:知识点1
-  2.知识点:知识点2
-  3.知识点:知识点3
+- 标题:
+  --步骤
+  --知识点
 
 # 限制
-1.如果有参考资料请根据参考资料,如果没有无需根据参考资料进行,随意发挥。
-2.你不能输出错误的知识。
-3.你不能输出违反伦理的内容。`;
+- 你不能输出错误的知识,如果你实在不清楚,输出“对不起,我不确定”
+- 你不能输出违反伦理的内容`;
                 }else if(this.courseState == 5){
                     message = `# 任务
-根据参考资料,为教师生成该任务的教学ppt的大纲,大纲是针对该任务相关知识点的讲解与相关练习和测试。你的输出应该符合#输出格式
+请根据<任务教案>,为教师生成本的教学ppt的大纲,大纲包含各环节的步骤,学科知识点。
 
 # 参考资料
 任务教案:${_this.unitJson[0].chapterInfo[0].taskJson[_this.lineCount].taskDetail3.replaceAll('#','').replaceAll('*','').replaceAll('-','').replaceAll('\n','')}
 ${mclass.length ? "面向年级:" + mclass.join(",") : ""}
 
-# 工作流
-1.从用户提供的参考资料中提取3个最重要的学科概念${mclass.length ? "(水平限制在{面向年级}中)" : ""},并输出。
-2.分解每个学科概念为几个子知识点
-3.简要描述每个知识点
-4.生成3个测试题以考察学生的掌握情况
-
 # 输出格式
-- 标题:学科概念1
-  1.知识点:知识点1
-  2.知识点:知识点2
-  3.知识点:知识点3
+- 标题:
+  --步骤
+  --知识点
 
 # 限制
-1.如果有参考资料请根据参考资料,如果没有无需根据参考资料进行,随意发挥。
-2.你不能输出错误的知识。
-3.你不能输出违反伦理的内容。`
+- 你不能输出错误的知识,如果你实在不清楚,输出“对不起,我不确定”
+- 你不能输出违反伦理的内容
+`
 
                 }
             }
@@ -474,7 +449,11 @@ ${mclass.length ? "面向年级:" + mclass.join(",") : ""}
                 });
                 let tempResult3 = '';
                 if (typeof array[i].points == 'object') {
-                    tempResult3 = array[i].points.join('\n')
+                    if (Array.isArray(array[i].points)) { 
+                        tempResult3 = array[i].points.join('\n')
+                    } else { 
+                        tempResult3 = JSON.stringify(array[i].points)
+                    }
                 } else {
                     tempResult3 = array[i].points
                 }

+ 1 - 1
src/components/pages/aiAddCourse/aiCreateVideoDialog.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-dialog title="AI生成视频" :visible.sync="dialogVisibleAiCreateVideo" :append-to-body="true" width="700px"
+    <el-dialog title="智能检索" :visible.sync="dialogVisibleAiCreateVideo" :append-to-body="true" width="700px"
         :before-close="handleClose" class="dialog_diy">
         <div style="height: 500px;padding:15px" v-loading="loading" element-loading-text="小可正在努力生成中,请稍等...">
             <div style="position: relative; width: 100%;height: 40px;margin-bottom: 10px;">

+ 13 - 3
src/components/pages/aiAddCourse/aiDialog.vue

@@ -6,10 +6,15 @@
                 <span :class="{active: type == 1}">基础创建</span>
             </div>
             <div class="ai_detail" v-if="type == 1">
-                <span class="title">默认的提示词</span>
+                <span class="title">{{text2 ? '默认的提示词1' : '默认的提示词'}}</span>
                 <textarea rows="10" class="binfo_input binfo_textarea" cols v-model="text"
                       placeholder="请输入...."></textarea>
             </div>
+            <div class="ai_detail" v-if="text2 && type == 1" style="margin-top: 10px;">
+                <span class="title">默认的提示词2</span>
+                <textarea rows="10" class="binfo_input binfo_textarea" cols v-model="text2"
+                      placeholder="请输入...."></textarea>
+            </div>
         </div>
         <span slot="footer" class="dialog-footer">
             <el-button @click="confirm" type="primary">确 定</el-button>
@@ -29,6 +34,9 @@ export default {
         aiText: {
             type: String,
         },
+        aiText2: {
+            type: String,
+        },
         clickType: {
             type: Number
         }
@@ -36,13 +44,15 @@ export default {
     data() {
         return {
             type: 1,
-            text: ""
+            text: "",
+            text2: "",
         }
     },
     watch:{
         dialogVisibleAiD(newValue, oldValue) {
             if(newValue){
                 this.text = JSON.parse(JSON.stringify(this.aiText))
+                this.text2 = this.aiText2 ? JSON.parse(JSON.stringify(this.aiText2)) : ''
                 if(this.clickType == 2){
                     this.confirm();
                 }
@@ -58,7 +68,7 @@ export default {
             this.$emit('update:dialogVisibleAiD', false)
         },
         confirm(){
-            this.$emit("aiConfirm",this.text);
+            this.$emit("aiConfirm",this.text,this.text2);
             this.$emit('update:dialogVisibleAiD', false)
         }
     },

Dosya farkı çok büyük olduğundan ihmal edildi
+ 776 - 699
src/components/pages/classroomObservation/components/chatArea.vue


+ 1 - 1
src/components/pages/classroomObservation/components/mdView.vue

@@ -31,7 +31,7 @@ const getFile = (url) => {
 		}
 		var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
 		let name = decodeURIComponent(
-			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
 		);
 		var params = {
 			Bucket: "ccrb",

Dosya farkı çok büyük olduğundan ihmal edildi
+ 2045 - 946
src/components/pages/classroomObservation/components/messageArea.vue


+ 1 - 1
src/components/pages/classroomObservation/components/pieChart.vue

@@ -26,7 +26,7 @@ const getFile = (url) => {
 		}
 		var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
 		let name = decodeURIComponent(
-			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
 		);
 		var params = {
 			Bucket: "ccrb",

Dosya farkı çok büyük olduğundan ihmal edildi
+ 665 - 706
src/components/pages/classroomObservation/index.vue


+ 66 - 14
src/components/pages/components/worksDetail2.vue

@@ -228,12 +228,19 @@
               />
             </div> -->
           </div>
-          <div class="zyBoxC">
+          <div class="zyBoxC" ref="reportPdf">
             <div class="courseTitle" v-if="allWorks.course">
               <div class="txName">
                 <div class="tx"><img :src="tx" alt="" /></div>
                 <div>{{ allWorks.sName }}</div>
                 <div>{{ allWorks.course }}</div>
+                <el-button
+                  type="primary"
+                  size="mini"
+                  style="margin-left: 15px;"
+                  @click="getPdf"
+                  >导出pdf</el-button
+                >
               </div>
 
               <div class="topButton" v-if="tableData.length > 1">
@@ -1582,6 +1589,8 @@ import StudentData from "./studentData";
 import pdf from "./vpdf";
 import htmlDocx from "html-docx-js/dist/html-docx";
 import saveAs from "file-saver";
+import html2canvas from "html2canvas";
+import jspdf from "jspdf";
 export default {
   components: {
     StudentData,
@@ -1851,6 +1860,49 @@ export default {
     });
   },
   methods: {
+    getPdf(){
+      let domHeight = this.$refs.reportPdf.offsetHeight;
+      console.log('this.$refs.reportPdf',this.$refs.reportPdf.offsetHeight);
+      let maxHeight = 64257;
+      html2canvas(this.$refs.reportPdf, {
+        useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
+        scale: (maxHeight/domHeight) > 1 ? 1: (maxHeight/domHeight)
+    }).then((canvas) => {
+        const contentWidth = canvas.width;
+        const contentHeight = canvas.height;
+
+        let pageHeight = contentWidth / 592.28 * 841.89;
+        let leftHeight = contentHeight;
+
+        //页面偏移
+        var position = 0;
+        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
+        var imgWidth = 595.28; // A4 宽度
+        var imgHeight = 592.28/contentWidth * contentHeight; // A4总高度
+        var pageData = canvas.toDataURL('image/jpeg', 1.0);
+
+        var pdf = new jspdf('', 'pt', 'a4');
+
+        //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
+        //当内容未超过pdf一页显示的范围,无需分页
+        // if (leftHeight < pageHeight) {
+            pdf.addImage(pageData, 'JPEG', 10, 0, imgWidth-20, imgHeight );
+        // } else {
+        //     while(leftHeight > 0) {
+        //         pdf.addImage(pageData, 'JPEG', 10, position, imgWidth-20, imgHeight)
+        //         leftHeight -= pageHeight;
+        //         position -= 841.89;
+        //         //避免添加空白页
+        //         if(leftHeight > 0) {
+        //             pdf.addPage();
+        //         }
+        //     }
+        // }
+        pdf.save('js.pdf')
+
+    })
+
+    },
 		changeClass(){//切换班级
 			this.searchWork2();
 			this.getCourseDetail()
@@ -3994,7 +4046,7 @@ export default {
   border-radius: 5px;
   width: 90%;
   box-shadow: 2px 2px 5px #909090;
-  overflow: auto;
+  /* overflow: auto; */
 }
 
 .sd_score .score_box {
@@ -4201,9 +4253,9 @@ export default {
   background: #ededed;
   display: flex;
   align-items: flex-start;
-  justify-content: center;
+  /* justify-content: center; */
   flex-direction: column;
-  height: calc(100% - 50px);
+  min-height: calc(100% - 50px);
 }
 
 .zyBox {
@@ -4550,7 +4602,7 @@ export default {
   flex-direction: row;
   flex-wrap: nowrap;
   align-items: flex-start;
-  height: 253px;
+  /* height: 253px; */
 }
 
 .left_top {
@@ -4571,12 +4623,12 @@ export default {
   align-items: flex-start;
   width: 100%;
   height: calc(100% - 60px);
-  overflow: auto;
+  /* overflow: auto; */
 }
 
 .right_score {
   min-width: 370px;
-  height: 351px;
+  min-height: 351px;
   margin-left: 10px;
 }
 
@@ -4765,9 +4817,9 @@ export default {
   display: flex;
   flex-direction: row;
   flex-wrap: nowrap;
-  align-items: flex-start;
+  /* align-items: flex-start; */
   width: 100%;
-  height: 351px;
+  /* height: 351px; */
   margin-bottom: 20px;
 }
 
@@ -4778,7 +4830,7 @@ export default {
   align-items: center;
   width: 100%;
   flex-wrap: nowrap;
-  overflow: auto;
+  /* overflow: auto; */
   /* height: 500px; */
   height: 100%;
 }
@@ -4893,9 +4945,9 @@ export default {
 }
 .radioBox {
   display: flex;
-  flex-direction: row;
-  flex-wrap: nowrap;
-  align-items: center;
+  flex-direction: column;
+  flex-wrap: wrap;
+  /* align-items: center; */
 }
 .radioBox > div {
   margin: 10px 0 0 10px;
@@ -4954,7 +5006,7 @@ export default {
 }
 .contentAuto {
   width: 100%;
-  height: 253px;
+  /* height: 253px; */
   overflow: auto;
 }
 .evalCss {

+ 1 - 1
src/components/pages/course.vue

@@ -461,7 +461,7 @@ export default {
       pTypeCheckName: [],
       btnDisplay: false,
       dialogVisibleTemplate: false,
-      orgArray:['1973f6c7-1561-11ee-91d8-005056b86db5','777559d2-7239-11ee-b98c-005056b86db5','884c5665-a453-46f3-b7b6-01d575290aa9','0fec3a8a-ad04-11ed-b13d-005056b86db5'],
+      orgArray:['1973f6c7-1561-11ee-91d8-005056b86db5','777559d2-7239-11ee-b98c-005056b86db5','884c5665-a453-46f3-b7b6-01d575290aa9','0fec3a8a-ad04-11ed-b13d-005056b86db5','c9a6de59-8b4f-4be1-8565-a08081f649d3'],
       oidArray:['f297fbdc-f0a0-11ee-b534-005056b86db5','45facc0a-1211-11ec-80ad-005056b86db5']
     };
   },

+ 3 - 3
src/components/pages/dataBoardNew/course/index.vue

@@ -63,7 +63,7 @@
             style="cursor: pointer; padding: 0 0 5px 0">
             作业数量
           </div>
-          <el-select v-if="skType == 0" v-model="lType" @change="typeChange1" class="selectBox" style="margin-left: auto">
+          <el-select v-if="skType == 0 && !oType" v-model="lType" @change="typeChange1" class="selectBox" style="margin-left: auto">
             <!-- <el-option label="全部" value="all"></el-option> -->
             <el-option label="年级" value="grade"></el-option>
             <el-option label="主题" value="theme"></el-option>
@@ -150,8 +150,8 @@
             </div>
           </div> -->
           <div class="dataBoard_check_box" v-if="skType == 0">
-            <div class="icon zz_icon2" :class="{ active: !oType }" @click="oType = false"><span>柱状图</span></div>
-            <div class="icon rl_icon" :class="{ active: oType }" @click="oType = true"><span>热力图</span></div>
+            <div class="icon zz_icon2" :class="{ active: !oType }" @click="oType = false,lType = 'grade',typeChange1()"><span>柱状图</span></div>
+            <div class="icon rl_icon" :class="{ active: oType }" @click="oType = true,lType = 'all',typeChange1()"><span>热力图</span></div>
           </div>
           <div class="dataBoard_check_box" v-if="skType == 1">
             <div class="icon zz_icon2" :class="{ active: oType2 }" @click="oType2 = true"><span>柱状图</span></div>

+ 3 - 3
src/components/pages/dataBoardNew/project/chartList/bar/teacherStudent.vue

@@ -72,13 +72,13 @@ export default {
                     shadow: false
                 },
                 series: [{
-                    name: '教师负责',
+                    name: '教师协同',
                     data: []
                 }, {
-                    name: '学生负责',
+                    name: '学生主导',
                     data: []
                 }, {
-                    name: '师生负责',
+                    name: '师生主导',
                     data: []
                 }]
             }

+ 4 - 2
src/components/pages/dataBoardNew/project/index.vue

@@ -817,11 +817,13 @@ export default {
               _courseArray[i].subject.push({
                 name: _subject[j].name,
                 id: _subject[j].id,
-                course: 0
+                course: 0,
+                courseArray: []
               })
               for (var z = 0; z < _course.length; z++) {
-                if (_course[z].typeid.indexOf(_subject[j].id) != -1 && _courseArray[i].courseid.indexOf(_course[z].courseid) !== -1) {
+                if (_course[z].typeid.indexOf(_subject[j].id) != -1 && _courseArray[i].courseid.indexOf(_course[z].courseid) !== -1 && _courseArray[i].subject[j].courseArray.indexOf(_course[z].courseid) == -1) {
                   _courseArray[i].subject[j].course++
+                  _courseArray[i].subject[j].courseArray.push(_course[z].courseid)
                 }
               }
             }

+ 2 - 2
src/components/pages/dataBoardNew/student/index.vue

@@ -328,7 +328,7 @@
                   ></el-progress>
                 </div>
               </div>
-              <div class="depth">
+              <!-- <div class="depth">
                 <span>协同合作</span>
                 <div>
                   <el-progress
@@ -340,7 +340,7 @@
                     color="#106BFF"
                   ></el-progress>
                 </div>
-              </div>
+              </div> -->
               <div class="depth">
                 <span>互动交流</span>
                 <div>

+ 1 - 1
src/components/pages/dataBoardNew/teacher/index.vue

@@ -533,7 +533,7 @@
     <div class="right">
       <div class="top" style="border-radius: 5px">
         <div class="titleBox" style="justify-content: space-between">
-          <div class="title">年级占比</div>
+          <div class="title">整体分布</div>
           <el-select v-model="cType4" @change="typeChange" class="selectBox">
             <!-- <el-option label="全部" value=""></el-option> -->
             <el-option label="年级" value="grade"></el-option>

+ 2 - 2
src/components/pages/library/fileBox.vue

@@ -188,7 +188,7 @@ const getFile = (url) => {
             _url2 = url2;
         }
         var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' '))
         var params = {
             Bucket: "ccrb",
             Key: name
@@ -610,7 +610,7 @@ export default {
             let _this = this;
 
             var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-            let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+            let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' '))
             var params = {
                 Bucket: "ccrb",
                 Key: name

+ 1 - 1
src/components/pages/test/add/edit/check/file.vue

@@ -715,7 +715,7 @@ export default {
       _this.downLoading = _url2;
       var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
       let name = decodeURIComponent(
-        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
       );
       var params = {
         Bucket: "ccrb",

+ 5 - 0
src/components/pages/test/add/edit/check/uploadFile.vue

@@ -54,6 +54,7 @@ export default {
 		// },
 		// 初始化上传入口
 		async initMultipartUpload(key, file) {
+			console.log(file)
 			const params = {
 				Bucket: this.bucketname,
 				Key: key,
@@ -208,6 +209,7 @@ export default {
 
 		//上传的接口
 		async awsupload({ file = this.file, keyName, folderName }) {
+			console.log('successsuccesssuccesssuccesssuccesssuccesssuccesssuccesssuccesssuccesssuccess')
 			if (!file) return this.$message.error("请上传文件");
 			this.init(); //初始化桶
 			// const key = (folderid || uuidv4()) + "/" + file.name; //需要上传的文件名
@@ -224,6 +226,9 @@ export default {
 							file.name.split(".")[file.name.split(".").length - 1]}`;
 				}
 			}
+			console.log(key);
+			// key = key.replace(/\s/g, "");
+			// key = encodeURIComponent(key);
 			this.filestate = {
 				percent: 0,
 				status: "start",

+ 6 - 1
src/components/pages/test/add/setInfo/index.vue

@@ -74,7 +74,12 @@
                 </div>
             </div>
         </div>
-        <div class="whiteBg" style="background:#fff;margin: 10px 0;min-height: 300px;">
+        <div class="e_btn" style="display: flex;justify-content: center;margin-top: 10px;" v-show="oid == 'd67940a5-510c-40ea-9c9a-2631ab03013a'">
+            <el-button type="primary" size="mini" @click="nextSteps()"
+            >下一步</el-button
+            >
+        </div>
+        <div class="whiteBg" style="background:#fff;margin: 10px 0;min-height: 300px;" v-show="oid != 'd67940a5-510c-40ea-9c9a-2631ab03013a'">
             <div class="whiteBg" style="border-radius: 0">
                 <div class="c_info_title">创建表单内容</div>
                 <div class="c_info_box">

+ 208 - 23
src/components/pages/test/aggregate/index.vue

@@ -1,12 +1,37 @@
 <template>
   <div class="aggregate">
-    <el-table :data="tableData" border style="width: 100%" v-loading="tabLoading" @header-click="handleHeaderClick">
-      <el-table-column fixed align="center" type="index" width="50">
+    <el-table
+      :data="tableData"
+      border
+      max-height="750px"
+      v-loading="tabLoading"
+    >
+      <el-table-column
+        fixed
+        align="center"
+        label="序号"
+        type="index"
+        width="50"
+      >
       </el-table-column>
 
-      <el-table-column fixed align="center" prop="username" label="教师姓名" width="150">
+      <el-table-column
+        align="center"
+        prop="username"
+        label="教师姓名"
+        fixed
+        width="150"
+      >
       </el-table-column>
-      <el-table-column fixed align="center" label="教研室" width="130">
+      <el-table-column
+        :filters="TeachingOptions"
+        :filter-method="filterTea"
+        align="center"
+        prop="tea"
+        fixed
+        label="教研室"
+        width="130"
+      >
         <template slot-scope="scope">
           <div class="TabBtn" v-if="!scope.row.tea">/</div>
           <div class="TabBtn" v-else>{{ scope.row.tea }}</div>
@@ -16,13 +41,55 @@
       <div v-for="item in titList" :key="item.id">
         <el-table-column align="center" :label="item.name">
           <div v-for="e in allFrom" :key="e.courseId">
-            <el-table-column v-if="e.typeid == item.id" align="center" :prop="e.courseId" :label="e.title"
-              :cell-style="{ color: '#000' }" width="130">
+            <el-table-column
+              v-if="e.typeid == item.id"
+              align="center"
+              :prop="e.courseId"
+              :label="e.title"
+              show-overflow-tooltip
+              width="130"
+              :resizable="false"
+            >
+              <template slot="header" slot-scope="{ column, $index }">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="e.title"
+                  placement="top"
+                >
+                  <div class="tooltipTit" @click="goFrom2(column)">
+                    {{ e.title }}
+                  </div>
+                </el-tooltip>
+              </template>
               <template slot-scope="scope">
-                <div v-if="e.juri2 && arrayToArray(scope.row.teaId ? scope.row.teaId.split(',') : [],e.juri2 ? e.juri2.split(',') : []).length && scope.row.works.indexOf(e.courseId) !== -1"
-                  class="yuan blacky"></div>
-                <div v-else-if="scope.row.works.indexOf(e.courseId) !== -1" class="yuan blacky"></div>
-                <div v-else-if="e.juri2 && arrayToArray(scope.row.teaId ? scope.row.teaId.split(',') : [],e.juri2 ? e.juri2.split(',') : []).length == 0" class="yuan greyy"></div>
+                <div
+                  v-if="
+                    e.juri2 &&
+                      arrayToArray(
+                        scope.row.teaId ? scope.row.teaId.split(',') : [],
+                        e.juri2 ? e.juri2.split(',') : []
+                      ).length &&
+                      scope.row.works.indexOf(e.courseId) !== -1
+                  "
+                  class="yuan blacky"
+                  @click="gotoFrom(e.courseId, scope.row.userid)"
+                ></div>
+                <div
+                  v-else-if="scope.row.works.indexOf(e.courseId) !== -1"
+                  class="yuan blacky"
+                  @click="gotoFrom(e.courseId, scope.row.userid)"
+                ></div>
+                <div
+                  v-else-if="
+                    e.juri2 &&
+                      arrayToArray(
+                        scope.row.teaId ? scope.row.teaId.split(',') : [],
+                        e.juri2 ? e.juri2.split(',') : []
+                      ).length == 0
+                  "
+                  class="yuan greyy"
+                ></div>
                 <div v-else class="yuan"></div>
               </template>
             </el-table-column>
@@ -30,6 +97,24 @@
         </el-table-column>
       </div>
     </el-table>
+
+    <!-- 查看数据来源 -->
+    <el-dialog
+      title=""
+      :visible.sync="diaIframe"
+      :append-to-body="true"
+      width="95%"
+      :before-close="handleClose2"
+      class="dialog_diy"
+    >
+      <div style="height: 100%;">
+        <iframe
+          ref="viframe"
+          style="width: 100%; height: 99%; border: none"
+          :src="ifmUrl"
+        ></iframe>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -43,15 +128,20 @@ export default {
       tableData: [],
       titList: [],
       allFrom: [],
-      tabLoading: false
+      tabLoading: false,
+      TeachingOptions: [],
+      diaIframe: false,
+      ifmUrl: ""
     };
   },
 
   mounted() {
     this.getData();
+    this.getTeaList();
   },
 
   methods: {
+    // 处理数据
     arrayToArray(arrayo, arrayt) {
       let array1 = arrayo;
       let array2 = arrayt;
@@ -67,6 +157,44 @@ export default {
       }
       return commonElements;
     },
+    gotoFrom(val, uid) {
+      // return console.log(val, uid);
+      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${uid}`;
+      // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;
+      this.diaIframe = true;
+    },
+    // 教研室筛选
+    filterTea(value, row, column) {
+      // console.log(value, row, column);
+      const property = column["property"];
+      return row[property].includes(value);
+    },
+    // 获取教研室
+    getTeaList() {
+      let params = {
+        oid: this.oid
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
+        .then(res => {
+          // return console.log("this.TeachingOptions", res.data[0]);
+          let data = res.data[0];
+          let dataCopy = [];
+
+          data.forEach(e => {
+            let a = {};
+            a.value = e.name;
+            a.text = e.name;
+            dataCopy.push(a);
+          });
+
+          this.TeachingOptions = dataCopy;
+          // console.log("this.TeachingOptions", this.TeachingOptions);
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
     getData() {
       this.tabLoading = true;
 
@@ -89,6 +217,11 @@ export default {
               }
             });
           });
+          data.forEach(e => {
+            if (!e.tea) {
+              e.tea = "";
+            }
+          });
           this.tableData = data;
           this.tabLoading = false;
         })
@@ -96,21 +229,23 @@ export default {
           console.log(error);
         });
     },
-    handleHeaderClick(column, event) {
-      // console.log("表头被点击", column, event);
+    // 数据来源关闭弹框
+    handleClose2(done) {
+      done();
+    },
+    goFrom2(column) {
       this.$router.push(
         "/checkToTest?cid=" +
-        column.property +
-        "&oid=" +
-        this.oid +
-        "&org=" +
-        this.org +
-        "&type=" +
-        2 +
-        "&role=" +
-        this.role
+          column.property +
+          "&oid=" +
+          this.oid +
+          "&org=" +
+          this.org +
+          "&type=" +
+          2 +
+          "&role=" +
+          this.role
       );
-      // 在这里处理点击事件
     }
   }
 };
@@ -128,10 +263,60 @@ export default {
 
 .blacky {
   background-color: #000;
+  cursor: pointer;
 }
 
 .greyy {
   background-color: #eee;
   border: 1px solid #eee;
 }
+.dialog_diy >>> .el-dialog {
+  height: 95%;
+  margin: 0 auto !important;
+  margin-top: 20px !important;
+  overflow: hidden;
+  min-width: 800px !important;
+}
+
+.dialog_diy >>> .el-dialog__header {
+  background: #454545 !important;
+  padding: 25px 20px;
+}
+
+.dialog_diy >>> .el-dialog__body {
+  height: calc(100% - 50px);
+  box-sizing: border-box;
+  padding: 0px;
+}
+
+.dialog_diy >>> .el-dialog__title {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__body,
+.dialog_diy >>> .el-dialog__footer {
+  background: #fafafa;
+}
+
+.tooltipTit {
+  -webkit-line-clamp: 2;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  height: 50px !important;
+}
+
 </style>

+ 180 - 17
src/components/pages/test/check/index.vue

@@ -63,6 +63,8 @@
               </div>
             </div>
           </div>
+
+          <!-- pc端 查看切换 isDesktop-->
           <div class="search_nav" v-if="isDesktop">
             <div class="right">
               <span :class="{ active: stype == 1 }" @click="checkDataType(1)" v-if="!peopleId">按题目查看</span>
@@ -70,7 +72,8 @@
               <span :class="{ active: stype == 3 }" @click="checkDataType(3)" v-show="false">按数量查看</span>
             </div>
             <div class="left"  v-if="isDesktop">
-              <div style="margin-right: 10px;position: relative;" v-if="stype == 2 || stype == 3">
+              <!-- <div style="margin-right: 10px;position: relative;" v-if="stype == 2 || stype == 3"> -->
+              <div style="margin-right: 10px;position: relative;">
                 <el-select v-model="TeachingValue" @change="searchCourse" placeholder="按教研室">
                   <el-option
                     label="全部"
@@ -109,6 +112,7 @@
                 <el-input v-model="courseName" class="student_input" :disabled="!(!peopleId)" placeholder="请输入需要搜索的姓名"></el-input>
                 <span class="serach_icon" @click="searchCourse" ></span>
               </div>
+              
               <div class="btnA" v-if="stype == 1 && !pdfLoading" @click="exportPDF">导出PDF</div>
               <div class="btnA" v-if="stype == 2" @mouseenter="btnDisplay = true" @mouseleave="btnDisplay = false">
                 导出数据
@@ -120,6 +124,8 @@
               <div class="btnA" v-if="stype == 3" @click="exportAllWord2">导出人员数据</div>
             </div>
           </div>
+
+          <!-- 手机端 查看切换 isDesktop-->
           <div class="search_nav" style="display:flex;justify-content:space-evenly;border: none;" v-if="!isDesktop">
             <div class="right">
               <span :class="{ active2: stype == 1 }" @click="checkDataType(1)">按题目查看</span>
@@ -128,6 +134,7 @@
             </div>
           </div>
 
+          <!-- 按题目pc端 isDesktop-->
           <div class="title_content" v-if="stype == 1 && isDesktop" v-loading="isLoading">
             <div class="title_box" v-if="!testArray.length"
               style="display: flex;align-items: center;justify-content: center;height: 500px;">
@@ -140,7 +147,7 @@
                     :class="{ test_icon_check: item.type == 1 && item.atype == 2, test_icon_checkO: item.type == 1 && item.atype == 1, test_icon_gap: item.type == 3, test_icon_file: item.type == 5, test_course_file: item.type == 6, test_eva_file: item.type == 7,test_icon_time: item.type == 8 }"></span>
                 </el-tooltip>
                 <span>{{ item.title }}</span>
-								<el-button v-if="item.type == 5 && item.array.length>0" class="title_downBtn" type="primary" size="small" @click.stop="downloadFileType5(item.array,item.title)">批量下载附件</el-button>
+								<el-button v-if="item.type == 5 && item.array.length>0" class="title_downBtn" type="primary" size="small" @click.stop="downloadFileType5(item.array,item.title,index)">批量下载附件</el-button>
 								<div v-if="item.type==7" style="right:0;position: absolute;">平均分:{{ getAverageScore(index) }}</div>
               </div>
               <div class="detail" v-if="item.detail">{{ item.detail }}</div>
@@ -191,7 +198,7 @@
                   </wordcloud>
                 </div>
               </div>
-              <div class="content3" v-if="item.type == 5">
+              <div class="content3" :style="{'position': 'relative','overflow': (fileLoading[index].bool ? 'hidden':'auto')}" v-if="item.type == 5">
                 <div class="file" v-for="(file, index2) in item.array" :key="index + '-' + index2"
                   @click.stop="checkFile(file)">
                   <img class="download" src="../../../../assets/icon/fileIcon/download.png"
@@ -207,6 +214,28 @@
                     </el-tooltip>
                   </div>
                 </div>
+                <div v-if="
+                    fileLoading[index].bool
+                  " class="mask">
+                    <div class="progressBox">
+                      <div class="lbox">
+                        <img src="../../../../assets/loading.gif" />打包中,请稍后
+                      </div>
+                      <div style="margin-bottom: 10px">
+                        <span>{{
+                           fileLoading[index].load
+                          }}</span>
+                        /
+                        <span>{{
+                           fileLoading[index].count
+                          }}</span>
+                      </div>
+                      <el-progress :text-inside="true" :stroke-width="20" :percentage=" fileLoading[index].progress
+                        ?  fileLoading[index].progress
+                        : 0
+                        " style="width: 80%"></el-progress>
+                    </div>
+                </div>
               </div>
               <div class="content4" v-if="item.type == 6">
                 <div class="out_box" v-for="(item, index) in item.courseArray" :key="index + '-' + index2">
@@ -286,6 +315,7 @@
               </div>
             </div>
           </div>
+          <!-- 按题目手机端 !isDesktop-->
           <div class="title_content" v-if="stype == 1 && !isDesktop" v-loading="isLoading">
             <div class="title_box" v-if="!testArray.length"
               style="display: flex;align-items: center;justify-content: center;height: 500px;">
@@ -469,6 +499,8 @@
               </div>
             </div>
           </div>
+
+          <!-- 按人员pc端 isDesktop-->
           <div class="table_content" v-if="stype == 2 && isDesktop">
             <el-table class="el-table" ref="table" :data="worksArray" border :fit="true" :key="2" v-loading="isLoading"
               style="width: 100%" :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
@@ -534,6 +566,7 @@
               </el-table-column>
             </el-table>
           </div>
+          <!-- 按人员手机端 !isDesktop-->
           <div class="table_content" v-if="stype == 2 && !isDesktop">
 
             <div v-for="(i,index) in worksArray"  :key="i.id" class="isDesktopTable_content">
@@ -549,7 +582,7 @@
                 <div class="isDBri">
                   <div>序号:{{ i.time }}</div>
                   <div>提交时间:{{ i.time }}</div>
-                  <div>评课人:</div>
+                  <div>评课人:{{ i.uteaName }}</div>
                 </div>
                 <div style="height: 1px;background-color: #717C8D;width: 100%;margin-bottom: 10px;"></div>
                 <div>
@@ -610,7 +643,7 @@
                             <img class="IsDImg" :src="file.url" alt="" v-if="file.type == 3" />
                             <img class="IsDImg" :src="wordIcon" alt="" v-if="file.type == 4" />
                             <img class="IsDImg" :src="fileIcon" alt="" v-if="file.type == 5" />
-                            <div class="name" style="height: 30px;background-color: #ccc;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
+                            <div class="name" style="height: 30px;background-color: #f9f9f9;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
                               <!-- <el-tooltip :content="file.name" placement="top" effect="dark"> -->
                                 {{ file.name }}
                               <!-- </el-tooltip> -->
@@ -766,6 +799,8 @@
         </div>
       </div>
     </div>
+
+   
     <share-box :testJson="testJson" :TeachingValue="TeachingValue" :TeachName="TeachNameCpt"   :dialogVisibleShare.sync="dialogVisibleShare"></share-box>
     <wpdf :dialogVisiblePdf.sync="dialogVisiblePdf" :url="wurl"></wpdf>
     <wVideo :dialogVisibleVideo.sync="dialogVisibleVideo" :url="wurl"></wVideo>
@@ -812,7 +847,7 @@ const getFile = (url) => {
             _url2 = url2;
         }
         var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' '))
         var params = {
             Bucket: "ccrb",
             Key: name
@@ -893,7 +928,13 @@ export default {
       chapters: [],
       filterPlacement: 'bottom-end',
       pdfLoading: false,
-      btnDisplay: false
+      btnDisplay: false,
+
+      fileLoading: [],
+      // fileLoadCount: [],
+      // fileLoadNum: [],
+      // infoprogress: [],
+
     };
   },
   watch: {},
@@ -981,6 +1022,9 @@ export default {
 		}
   },
   methods: {
+    fileClose(done){
+      done()
+    },
     //获取教研室列表
     getClass2() {
       let params = {
@@ -989,8 +1033,32 @@ export default {
       this.ajax
           .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
           .then((res) => {
+            console.log('this.TeachingOptions',this.TeachingOptions);
+            console.log(res.data);
+            let data = res.data[0];
+            this.TeachingOptions.forEach(e=>{
+              data.forEach(i=>{
+                if (e.id == i.id) {
+                  e.name = i.name
+                }
+              })
+            })
+          })
+          .catch((err) => {
+              this.isLoading = false;
+              console.error(err);
+          });
+    },
+    getClass3() {
+      let params = {
+          oid: this.oid,
+      };
+      this.ajax
+          .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
+          .then((res) => {
+            console.log(res.data);
               this.TeachingOptions = res.data[0];
-              console.log('this.TeachingOptions',this.TeachingOptions);
+              // console.log('this.TeachingOptions',this.TeachingOptions);
           })
           .catch((err) => {
               this.isLoading = false;
@@ -1082,6 +1150,7 @@ export default {
       );
     },
     checkDataType(type) {
+      this.TeachingValue = ''
       if (this.stype != type) {
         this.stype = type
         this.courseName = ''
@@ -1116,15 +1185,15 @@ export default {
           console.log('this.testJson',JSON.parse(JSON.stringify(this.testJson)));
           if (this.testJson.juriP) {
             let ajuri2 =  this.testJson.juri2.split (',');
-            let ajurip =  this.testJson.juriP.split (',');
-            let JData = ajuri2.reverse()
-            this.TeachingOptions = JData.map((key, index) => ({
+            this.TeachingOptions = ajuri2.map((key, index) => ({
               id : key,
-              name: ajurip[index]
+              name: ''
             }));
-          }else{
             this.getClass2()
+          }else{
+            this.getClass3()
           }
+
           // console.log('dddd',this.TeachingOptions);
 
           this.works = res.data[1]
@@ -1155,6 +1224,7 @@ export default {
                 time: this.works[i].time,
                 array: _json,
                 cut:0,
+                uteaName: this.works[i].uteaName,
                 courseJson: JSON.parse(this.works[i].courseJson),
               })
             }
@@ -1264,6 +1334,7 @@ export default {
             }
             console.log('topictopictopictopic',topic)
             testArray.push(topic)
+            this.fileLoading.push({bool:false,count:0,load:0,progress:0})
           }
           this.testArray = testArray
           this.worksArray = array
@@ -1440,7 +1511,7 @@ export default {
 
       _this.downLoading = _url2
       var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-      let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+      let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' '))
       var params = {
         Bucket: "ccrb",
         Key: name
@@ -1955,7 +2026,13 @@ export default {
       this.screenWidth = window.innerWidth;
       this.isDesktop = this.screenWidth > 750; // 你可以根据需要调整这个阈值
     },
-		downloadFileType5(fileData,title="附件"){
+		downloadFileType5(fileData,title="附件",index){
+      this.fileLoading[index].bool = true
+      this.fileLoading[index].count = 0
+      this.fileLoading[index].load = 0
+      this.fileLoading[index].progress = 0
+
+
 			let data = fileData;
 			const zip = new JSZip();
 			let downFileArray = [];
@@ -1964,6 +2041,11 @@ export default {
 				downFileArray.push({userid:i.userid,username:i.username ? i.username : '匿名',urlList:data.filter(d=>d.userid==i.userid).map(m=>m)});
 			})
 			let promises = [];
+      console.log('downFileArray',downFileArray);
+      downFileArray.forEach(e=>{
+        this.fileLoading[index].count += e.urlList.length
+      })
+
 			if(downFileArray.length==1){//只有一位老师的情况
 				if(downFileArray[0].urlList.length>1){//多个文件的情况
 					const folder = zip.folder(`${downFileArray[0].username}`);
@@ -1974,7 +2056,13 @@ export default {
         	          const file_name = i.name; // 获取文件名
 									  folder.file(file_name, data.data, { binary: true }); // 逐个添加文件
         	      }
+                this.fileLoading[index].load+=1
+                this.fileLoading[index].progress = parseInt((this.fileLoading[index].load / this.fileLoading[index].count) * 100);
+                if (this.fileLoading[index].load == this.fileLoading[index].count) {
+                  this.fileLoading[index].bool=false
+                }
         	  });
+           
 						promises.push(promise)
 					})
 					
@@ -1984,7 +2072,12 @@ export default {
         	      // 下载文件, 并存成ArrayBuffer对象
         	      const file_name = `${downFileArray[0].username}-${downFileArray[0].urlList[0].name}`; // 获取文件名
 								zip.file(file_name, data.data, { binary: true }); // 逐个添加文件
-        	    }
+            }
+            this.fileLoading[index].load+=1
+            this.fileLoading[index].progress = parseInt((this.fileLoading[index].load / this.fileLoading[index].count) * 100);
+            if (this.fileLoading[index].load == this.fileLoading[index].count) {
+              this.fileLoading[index].bool=false
+            }
 					}))
 				}
 			}else if(downFileArray.length>1){//有多位老师的情况
@@ -1995,7 +2088,12 @@ export default {
         	      // 下载文件, 并存成ArrayBuffer对象
         	      const file_name = `${i.username ? i.username : '匿名'}-${i.urlList[0].name}`; // 获取文件名
 								zip.file(file_name, data.data, { binary: true }); // 逐个添加文件
-        	    }
+              }
+              this.fileLoading[index].load+=1
+              this.fileLoading[index].progress = parseInt((this.fileLoading[index].load / this.fileLoading[index].count) * 100);
+              if (this.fileLoading[index].load == this.fileLoading[index].count) {
+                this.fileLoading[index].bool=false
+              }
 						}))
 					}else if(i.urlList.length>1){//有多个文件的
 						const folder = zip.folder(`${i.username ? i.username : '匿名'}`);
@@ -2006,6 +2104,11 @@ export default {
         	          const file_name = ui.name; // 获取文件名
 									  folder.file(file_name, data.data, { binary: true }); // 逐个添加文件
         	      }
+                this.fileLoading[index].load+=1
+                this.fileLoading[index].progress = parseInt((this.fileLoading[index].load / this.fileLoading[index].count) * 100);
+                if (this.fileLoading[index].load == this.fileLoading[index].count) {
+                  this.fileLoading[index].bool=false
+                }
 						  })
 							promises.push(promise)
 						})
@@ -2381,6 +2484,7 @@ export default {
 .title_content>.title_box>.title {
   font-size: 18px;
   display: flex;
+  min-height: 35px;
   white-space: pre-line;
 	position: relative;
 }
@@ -2895,4 +2999,63 @@ export default {
 	right: 10px;
 	top: 0;
 }
+.fileLoadDiv >>> .el-dialog__header{
+  display: none;
+}
+.fileLoadDiv >>> .el-dialog__body{
+  display: flex;
+  justify-content: center;
+}
+.fileLoadDiv >>> .el-dialog{
+  margin-top: 60vh !important;
+  width: 200px !important;
+  height: 80px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  border-radius: 15px;
+}
+.mask {
+  background-color: rgb(0 0 0 / 30%);
+  /* position: fixed; */
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 90;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.progressBox {
+  width: 300px;
+  height: 150px;
+  background: #fff;
+  border-radius: 10px;
+  box-shadow: 0 0 6px 1px #bfbfbf;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+  position: relative;
+  color: #6c6c6c;
+}
+
+.progressBox>>>.el-progress-bar__outer {
+  background-color: #d1dfff !important;
+}
+
+.progressBox .lbox {
+  height: 50px;
+  font-size: 19px;
+  display: flex;
+  align-items: center;
+  color: #747474;
+}
+
+.progressBox .lbox img {
+  width: 40px;
+  margin-right: 20px;
+}
 </style>

+ 128 - 21
src/components/pages/test/examine/conpoments/personPage.vue

@@ -76,6 +76,7 @@
             <div style="display: flex;justify-content: center;">
               <div class="TabBtn" @click="lookScore(scope.row)">评分</div>
               <div class="TabBtn" @click="withdraw(scope.row.id)">退回</div>
+              <div class="TabBtn" @click="recordBtn(scope.row.id)">记录</div>
             </div>
           </template>
         </el-table-column>
@@ -153,7 +154,7 @@
             <div>考核分数:{{ computedSco }}</div>
           </div>
         </div>
-        <div style="height:100%;overflow: hidden;padding-bottom: 80px;">
+        <div style="height:100%;overflow: auto;padding-bottom: 80px;">
           <div class="sBox_table">
             <div class="table_title">
               <div style="width: 150px;">一级指标</div>
@@ -208,26 +209,29 @@
                       </div>
                       <div style="display: flex;justify-content: center;">
                         <div v-if="tableData.length > 0" class="ScoreStep">
-                          <input
+                          <el-input
                             :style="{
                               color: k.sco1 == k.sco2 ? '#000' : 'red'
                             }"
-                            :readonly="txtLoading"
                             @blur="
                               saveTab(
-                                k.sco2 > k.score ? (k.sco2 = k.score) : ''
+                                k.id,
+                                k.sco2 > k.score
+                                  ? (k.sco2 = k.score)
+                                  : '' || k.sco2 < 0
+                                  ? (k.sco2 = '')
+                                  : ''
                               )
                             "
-                            type="number"
-                            v-model="k.sco2"
-                          />
+                            v-model.number="k.sco2"
+                            v-stopMousewheel
+                          ></el-input>
                         </div>
                       </div>
                       <div style="display: flex;justify-content: center;">
                         <textarea
-                          :readonly="txtLoading"
                           v-if="tableData.length > 0"
-                          @blur="saveTab()"
+                          @blur="saveTab(k.id)"
                           v-model.trim="k.cogSum"
                         />
                       </div>
@@ -260,13 +264,35 @@
     </el-dialog>
 
     <!-- 提醒弹框 -->
-
     <shareBox
       :remDig.sync="remDig"
       :pType="pType"
       :TeaList="TeaList"
     ></shareBox>
 
+    <el-dialog
+      title="评分记录"
+      :visible.sync="recordVisible"
+      class="recordDig"
+      :before-close="recordHandleClose"
+    >
+      <div>
+        <el-table border height="500px" :data="RecordList" style="width: 100%">
+          <el-table-column align="center" type="index" label="序号" width="80">
+          </el-table-column>
+          <el-table-column
+            align="center"
+            show-overflow-tooltip
+            prop="username"
+            label="教师姓名"
+          >
+          </el-table-column>
+          <el-table-column align="center" prop="dateTime" label="评分时间">
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-dialog>
+
     <!-- <el-dialog
       title="提醒"
       :visible.sync="remDig"
@@ -317,6 +343,16 @@
 <script>
 import shareBox from "./shareBox/index";
 export default {
+  directives: {
+    stopMousewheel: {
+      inserted: function(el) {
+        const ele = el.tagName === 'INPUT' ? el : el.querySelector('input');
+        ele.addEventListener("mousewheel", () => {
+          ele.blur();
+        });
+      }
+    }
+  },
   props: {
     pType: {
       //2专任教师 1班主任
@@ -336,6 +372,8 @@ export default {
       digType: 2,
       diaSco: false,
       diaIframe: false,
+      recordVisible: false,
+      RecordList: [],
       ifmUrl: false,
       PageBaseData: [],
       digUserid: "", //用户id
@@ -356,8 +394,7 @@ export default {
       org: this.$route.query.org, //组织id
       tableData: [],
       TeachingOptions: [],
-      txtLoading: false,
-
+      PageBaseDataTwo: [],
       remDig: false
     };
   },
@@ -420,6 +457,10 @@ export default {
     this.getTeaList();
   },
   methods: {
+    // 禁用滚轮事件
+    handleWheel(event) {
+      event.preventDefault();
+    },
     // 获取页面数据
     getData() {
       this.tabLoading = true;
@@ -556,12 +597,36 @@ export default {
           // });
         });
     },
+    recordBtn(val) {
+      this.RecordList = [];
+      this.recordVisible = true;
+      this.getRecordData(val);
+    },
+    // 查看记录
+    getRecordData(val) {
+      let params = {
+        tid: val,
+        type: this.pType
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectExamineOperateRecord", params)
+        .then(res => {
+          // console.log(res.data[0]);
+          this.RecordList = res.data[0];
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
+    recordHandleClose(done) {
+      done();
+    },
     // 提醒
     remindExamine() {
       this.remDig = true;
     },
+    // 下载excel
     getExcel() {
-      
       var res = this.tableData;
       // console.log('导出数据',res);
       //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
@@ -572,6 +637,9 @@ export default {
         _json["教师姓名"] = res[i].username;
         _json["教师账号"] = res[i].eName;
         _json["所属教研室"] = res[i].tea;
+        _json["考核进度"] = `${res[i].step}/${res[i].allStep}`;
+        _json["自评分数"] = res[i].evaSca;
+        _json["考核分数"] = res[i].cogSco;
         array.push(_json);
       }
 
@@ -580,9 +648,12 @@ export default {
       let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
       ws["!cols"] = [
         //设置每一列的宽度
+        { wch: 20 },
+        { wch: 30 },
         { wch: 30 },
         { wch: 30 },
         { wch: 30 },
+        { wch: 30 }
       ];
 
       XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
@@ -617,8 +688,33 @@ export default {
     // ----------------
 
     // 保存修改
-    saveTab() {
-      this.txtLoading = true;
+    saveTab(id) {
+      let a = { sco2: 0, cogSum: "" };
+      let b = { sco2: 0, cogSum: "" };
+      this.PageBaseData.forEach(e => {
+        e.children.forEach(i => {
+          if (i.id == id) {
+            a.sco2 = i.sco2;
+            a.cogSum = i.cogSum;
+          }
+        });
+      });
+
+      this.PageBaseDataTwo.forEach(e => {
+        e.children.forEach(i => {
+          if (i.id == id) {
+            b.sco2 = i.sco2;
+            b.cogSum = i.cogSum;
+          }
+        });
+      });
+
+      console.log(a, b, id);
+      if (
+        a.sco2 == b.sco2 &&
+        JSON.stringify(a.cogSum) === JSON.stringify(b.cogSum)
+      )
+        return;
 
       let PageBaseDataCopy = JSON.parse(JSON.stringify(this.PageBaseData));
 
@@ -632,16 +728,22 @@ export default {
 
       let params = [
         {
-          uid: this.digUserid,
+          uid: this.userid,
           tid: this.digTid,
-          json: JSON.stringify(PageBaseDataCopy)
+          typ: this.pType,
+          // json: JSON.stringify(PageBaseDataCopy)
+          json: JSON.stringify(PageBaseDataCopy),
+          rjson: JSON.stringify({
+            rjson: PageBaseDataCopy,
+            text: `按人员,进行修改`
+          })
         }
       ];
       // return console.log(params);
       this.ajax
-        .post(this.$store.state.api + "updateExamineCogData", params)
+        .post(this.$store.state.api + "updateExamineCogDataCopy", params)
         .then(res => {
-          // console.log("updateExamineCogData", res);
+          // console.log("updateExamineCogDataCopy", res);
           // this.CopDigSco();
           this.getDigData();
         })
@@ -772,6 +874,7 @@ export default {
           // console.log("selectTestExamineBase", res.data[0][0]);
 
           this.PageBaseData = JSON.parse(res.data[0][0].json);
+          this.PageBaseDataTwo = JSON.parse(res.data[0][0].json);
           // 处理数据来源
           this.handleData();
           // 先获取基础模板,然后再获取用户又没有填写过,填写过就开始循环赋值给基础模板,最后提交基础模板
@@ -811,7 +914,7 @@ export default {
                 }
               });
             });
-
+            this.PageBaseDataTwo = val;
             // 弹框计算自评分数,与二级指标个数
             this.getTwoRigData();
           } else {
@@ -819,7 +922,6 @@ export default {
             this.DigSelfSco = 0;
             this.twoTarget = 0;
           }
-          this.txtLoading = false;
           this.digLoading = false;
         })
         .catch(error => {
@@ -906,6 +1008,10 @@ export default {
   white-space: nowrap;
   text-overflow: ellipsis;
 }
+.recordDig >>> .el-dialog {
+  height: 600px;
+  width: 500px !important;
+}
 .remFlex {
   display: flex;
   justify-content: flex-start;
@@ -1002,6 +1108,7 @@ export default {
 .ScoreStep >>> .el-input__inner {
   height: 100%;
   padding-left: 15px;
+  border: none;
   padding-right: 15px;
 }
 .testPersonExamine {

+ 87 - 22
src/components/pages/test/examine/conpoments/targetPage.vue

@@ -236,23 +236,23 @@
           >
             <template slot-scope="scope">
               <div class="ScoreStep">
-                <input
-                  type="number"
-                  :readonly="TxtDig"
+                <el-input
                   v-if="scope.row.judge == 1"
-                  style=" color :#A7AAB2;"
+                  style=" color
+                :#A7AAB2;"
                   @blur="Submit(scope.row)"
-                  v-model="scope.row.cogSco"
-                />
-                <input
-                  type="number"
+                  v-model.number="scope.row.cogSco"
+                  v-stopMousewheel
+                ></el-input>
+                <el-input
                   v-else
                   :style="{
                     color: scope.row.cogSco == scope.row.evaSca ? '#000' : 'red'
                   }"
                   @blur="Submit(scope.row)"
-                  v-model="scope.row.cogSco"
-                />
+                  v-model.number="scope.row.cogSco"
+                  v-stopMousewheel
+                ></el-input>
               </div>
             </template>
           </el-table-column>
@@ -266,7 +266,6 @@
               <textarea
                 @blur="Submit2(scope.row)"
                 class="tArea"
-                :readonly="TxtDig"
                 v-model.trim="scope.row.cogSummary"
               />
             </template>
@@ -278,7 +277,18 @@
 </template>
 
 <script>
+// import Vue from 'vue';
 export default {
+  directives: {
+    stopMousewheel: {
+      inserted: function(el) {
+        const ele = el.tagName === "INPUT" ? el : el.querySelector("input");
+        ele.addEventListener("mousewheel", () => {
+          ele.blur();
+        });
+      }
+    }
+  },
   props: {
     pType: {
       //2专任教师 1班主任
@@ -292,7 +302,6 @@ export default {
       evaScoDigSvg: 0,
       evaScoDigCog: 0,
       evaScoDigPerC: 0,
-      TxtDig: false,
 
       diaIframe: false, //数据来源弹框
       diaScore: false, //查看分数弹框
@@ -1346,6 +1355,10 @@ export default {
   },
 
   methods: {
+    // 禁用滚轮事件
+    handleWheel(event) {
+      event.preventDefault();
+    },
     // 获取教研室
     getTeaList() {
       let params = {
@@ -1419,7 +1432,7 @@ export default {
           data.forEach(e => {
             e.json = JSON.parse(e.json);
           });
-          // console.log("data", data);
+          console.log("data", data);
 
           this.tableJsonCon.forEach(a => {
             data.forEach(b => {
@@ -1570,7 +1583,6 @@ export default {
           // 获取数据来源
           this.handleScoData();
           this.evaScoDig = false;
-          this.TxtDig = false;
         })
         .catch(error => {
           console.log(error);
@@ -1640,6 +1652,7 @@ export default {
 
     // 分数提交
     Submit(val) {
+      console.log("valvalvalvla", val);
       //#region
       // 修改了将页面上的分数也改变颜色,(方式改变,无用了)
       // this.tableData.forEach(e => {
@@ -1648,15 +1661,35 @@ export default {
       //   }
       // });
       //#endregion
-      this.TxtDig = true;
 
       if (val.cogSco > val.score) {
         val.cogSco = val.score;
+      } else if (val.cogSco < 0) {
+        val.cogSco = "";
+        this.$message.error("评分不能为负数");
       }
 
+      // 用来判断修改分数是否等于原先分数,如果相等就不提交
+      let judgeSubmit = 0;
+
+      val.json.forEach(e => {
+        if (judgeSubmit == 1) return;
+        e.children.forEach(i => {
+          if (i.id == this.secondId) {
+            if (i.sco2 == val.cogSco) {
+              judgeSubmit = 1;
+            }
+          }
+        });
+      });
+
+      if (judgeSubmit == 1) return;
+
+      let recordTit = "";
       val.json.forEach(e => {
         e.children.forEach(i => {
           if (i.id == this.secondId) {
+            recordTit = i.name;
             i.sco2 = val.cogSco;
             i.cogSum = val.cogSummary;
           }
@@ -1667,12 +1700,17 @@ export default {
         {
           uid: this.userid,
           tid: val.id,
-          json: JSON.stringify(val.json)
+          typ: this.pType,
+          json: JSON.stringify(val.json),
+          rjson: JSON.stringify({
+            rjson: val.json,
+            text: `按指标,修改了${recordTit}分数`
+          })
         }
       ];
       // return console.log(params);
       this.ajax
-        .post(this.$store.state.api + "updateExamineCogData", params)
+        .post(this.$store.state.api + "updateExamineCogDataCopy", params)
         .then(res => {
           this.getSecondData();
         })
@@ -1683,11 +1721,28 @@ export default {
 
     // 概述提交
     Submit2(val) {
-      this.TxtDig = true;
+      // 用来判断修改分数是否等于原先分数,如果相等就不提交
+      let judgeSubmit = 0;
+
+      val.json.forEach(e => {
+        if (judgeSubmit == 1) return;
+        e.children.forEach(i => {
+          if (i.id == this.secondId) {
+            if (i.cogSum == val.cogSummary) {
+              judgeSubmit = 1;
+            }
+          }
+        });
+      });
+
+      if (judgeSubmit == 1) return;
+
+      let recordTit = "";
 
       val.json.forEach(e => {
         e.children.forEach(i => {
           if (i.id == this.secondId) {
+            recordTit = i.name;
             i.cogSum = val.cogSummary;
           }
         });
@@ -1697,12 +1752,17 @@ export default {
         {
           uid: this.userid, //修改人id
           tid: val.id,
-          json: JSON.stringify(val.json)
+          typ: this.pType,
+          json: JSON.stringify(val.json),
+          rjson: JSON.stringify({
+            rjson: val.json,
+            text: `按指标,修改了${recordTit}概述`
+          })
         }
       ];
       // return console.log(params);
       this.ajax
-        .post(this.$store.state.api + "updateExamineCogData", params)
+        .post(this.$store.state.api + "updateExamineCogDataCopy", params)
         .then(res => {
           this.getSecondData();
         })
@@ -1759,14 +1819,19 @@ export default {
         {
           uid: this.userid,
           tid: val.id,
-          json: JSON.stringify(val.json)
+          typ: this.pType,
+          json: JSON.stringify(val.json),
+          rjson: JSON.stringify({
+            rjson: val.json,
+            text: `按指标,进行了一键保存`
+          })
         }
       ];
       // return console.log(params);
 
       return new Promise(resolve => {
         this.ajax
-          .post(this.$store.state.api + "updateExamineCogData", params)
+          .post(this.$store.state.api + "updateExamineCogDataCopy", params)
           .then(res => {
             resolve(res);
           })

+ 7 - 2
src/components/pages/test/examine/index.vue

@@ -35,7 +35,12 @@
             </el-option>
           </el-select>
         </div>
-        <div v-if="cutTable == 1" class="remindBtn" style="margin-right: 20px;" @click="excelBtn">
+        <div
+          v-if="cutTable == 1"
+          class="remindBtn"
+          style="margin-right: 20px;"
+          @click="excelBtn"
+        >
           导出
         </div>
         <div v-if="cutTable == 1" class="remindBtn" @click="personBtn">
@@ -88,7 +93,7 @@ export default {
     selectTeaName() {
       this.$refs.child.getData();
     },
-    excelBtn(){
+    excelBtn() {
       this.$refs.child.getExcel();
     },
     personBtn() {

+ 7 - 3
src/components/pages/test/shareBox/index.vue

@@ -74,10 +74,12 @@ export default {
             type: Object
         },
         TeachingValue: {
-            type: String
+            type: String,
+            default: ''
         },
         TeachName: {
-            type: Array
+            type: Array,
+            default: ''
         }
     },
     data() {
@@ -95,7 +97,8 @@ export default {
             if (this.TeachingValue == '') {
                 return this.testJson.juriP ? this.testJson.juriP : '所有人'
             }else{
-                return this.TeachName ? this.TeachName[0].name :'所有人'
+                // return this.testJson.juriP ? this.testJson.juriP : '所有人'
+                return this.TeachName ? this.TeachName[0].name : this.testJson.juriP ? this.testJson.juriP : '所有人'
             }
         }
     },
@@ -205,6 +208,7 @@ export default {
     },
     mounted(){
         console.log(top.origin);
+        console.log(this.testJson);
         // this.origin = top.origin
     },
 };

+ 30 - 4
src/components/pages/testPerson/examine/index.vue

@@ -68,9 +68,8 @@
                   <div>{{ k.score }}</div>
                   <div>
                     <div v-if="k.type == 1" class="ScoreStep">
-                      <input
+                      <el-input
                         v-if="allData.type * 1 != 2"
-                        type="number"
                         @blur="
                           saveTab(
                             k.sco1 > k.score
@@ -80,8 +79,9 @@
                               : ''
                           )
                         "
-                        v-model="k.sco1"
-                      />
+                        v-model.number="k.sco1"
+                        v-stopMousewheel
+                      ></el-input>
                       <div v-else>{{ k.sco1 }}</div>
                     </div>
                     <div v-else class="ScoreStep">/</div>
@@ -178,6 +178,16 @@
 
 <script>
 export default {
+  directives: {
+    stopMousewheel: {
+      inserted: function(el) {
+        const ele = el.tagName === "INPUT" ? el : el.querySelector("input");
+        ele.addEventListener("mousewheel", () => {
+          ele.blur();
+        });
+      }
+    }
+  },
   data() {
     return {
       pType: 2,
@@ -213,6 +223,10 @@ export default {
     // console.log(JSON.stringify(this.TeaTabJson));
   },
   methods: {
+    // 禁用滚轮事件
+    handleWheel(event) {
+      event.preventDefault();
+    },
     goFillIn(val) {
       this.$router.push(
         `/doTest?cid=${val}&org=${this.org}&type=3&role=${this.role}&isN=&oid=${this.oid}&userid=${this.userid}`
@@ -743,6 +757,18 @@ input[type="number"] {
 /* .twoCon > div >>> .el-input {
   height: 100% !important;
 } */
+.ScoreStep >>> .el-input-number {
+  height: 100% !important;
+}
+.ScoreStep >>> .el-input {
+  height: 100% !important;
+}
+.ScoreStep >>> .el-input__inner {
+  height: 100%;
+  padding-left: 15px;
+  border: none;
+  padding-right: 15px;
+}
 .twoCon > div > input {
   border: none;
   width: 100%;

+ 20 - 1
src/components/pages/testPerson/test/test.vue

@@ -46,6 +46,10 @@
                             <span>创建者:{{ item.username }}</span>
                         </el-tooltip>
                     </div>
+                    <div class="editBtn2" :style="`${item.open?'display:flex':''}`" v-if="!item.carray.length > 0">
+                        <span v-if="item.array.length === 0">去填写</span>
+                        <span v-else>再填一份</span>
+                    </div>
                     <div @click="doTest2(item.courseid)" class="editBtn" :style="`${item.open?'display:flex':''}`" v-if="!item.carray.length > 0">
                         <span v-if="item.array.length === 0">去填写</span>
                         <span v-else>再填一份</span>
@@ -776,6 +780,9 @@ export default {
 .test_panel_title:hover>.editBtn{
 	display: flex;
 }
+.test_panel_title:hover>.editBtn2{
+	display: flex;
+}
 
 
 .test_panel+.test_panel {
@@ -787,6 +794,7 @@ export default {
     display: flex;
     align-items: center;
     width: 100%;
+    position: relative;
     /* justify-content: space-between; */
     /* padding: 0 20px; */
     box-sizing: border-box;
@@ -876,7 +884,18 @@ export default {
     align-items: center;
     padding: 0 15px;
     cursor: pointer;
-
+    position: absolute;
+    right: 0;
+}
+.test_panel_title>.editBtn2 {
+    font-size: 16px;
+    color: #fff;
+    background: #3681fc;
+    height: 100%;
+    display: none;
+    align-items: center;
+    padding: 0 15px;
+    cursor: pointer;
 }
 
 .test_panel_title>.time>span+span {

+ 2 - 2
src/components/pages/testStudent/view/component/file.vue

@@ -242,7 +242,7 @@ const getFile = url => {
     }
     var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
     let name = decodeURIComponent(
-      _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+      _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
     );
     var params = {
       Bucket: "ccrb",
@@ -785,7 +785,7 @@ export default {
       _this.downLoading = _url2;
       var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
       let name = decodeURIComponent(
-        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1].replace(/\+/g, ' ')
       );
       var params = {
         Bucket: "ccrb",

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor