Browse Source

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

lzw 6 months ago
parent
commit
31258ef74b

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.a7d10369702dd5a1a907de32bbee63a1.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3eade43afd174522bb8a.js></script><script type=text/javascript src=./static/js/vendor.6bffbf9058a42e825dbc.js></script><script type=text/javascript src=./static/js/app.8c9a72de982ed41aa2d6.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.a5fe1f3f4d7d3f3861c2e784a777095a.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.de15001ce66f032e9274.js></script><script type=text/javascript src=./static/js/app.f154a5de151474e647b4.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.a5fe1f3f4d7d3f3861c2e784a777095a.css


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


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


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


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


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


+ 2 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js

@@ -0,0 +1,2 @@
+!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){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 c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(n&&n(r,c,a);l.length;)l.shift()();if(a)for(s=0;s<a.length;s++)f=o(o.s=a[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 c=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,o.nc&&a.setAttribute("nonce",o.nc),a.src=o.p+"static/js/"+e+"."+{0:"4f3b05586c3acc102a54",1:"14e8e8c7e44fc858e4a6",2:"94e1427bfc7ef0b4c685",3:"3a9f53a78da16650e6b8"}[e]+".js";var i=setTimeout(u,12e4);function u(){a.onerror=a.onload=null,clearTimeout(i);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=u,c.appendChild(a),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.161e82026ac2ae03ab6f.js.map

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


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


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


+ 25 - 0
package-lock.json

@@ -172,6 +172,31 @@
       "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
       "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
     },
+    "node_modules/@ffmpeg/core": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmmirror.com/@ffmpeg/core/-/core-0.10.0.tgz",
+      "integrity": "sha512-qunWJl5PezpXEm31tb8Qu5z37B5KVA1VYZCpXchMhuAb3X9T7PuE3SlhOwphEoRhzaOa3lpofDfzihAUMFaVPQ==",
+      "dev": true
+    },
+    "node_modules/@ffmpeg/ffmpeg": {
+      "version": "0.9.8",
+      "resolved": "https://registry.npmmirror.com/@ffmpeg/ffmpeg/-/ffmpeg-0.9.8.tgz",
+      "integrity": "sha512-QradleJx78hHJBtI1wRsus1L1jxQB3v4h6k8c3CERI9fssm+NSSppuofmsOei7uq7iQEYq3oK9tJNAyEsRoNng==",
+      "dependencies": {
+        "is-url": "^1.2.4",
+        "node-fetch": "^2.6.1",
+        "regenerator-runtime": "^0.13.7",
+        "resolve-url": "^0.2.1"
+      },
+      "engines": {
+        "node": ">=12.16.1"
+      }
+    },
+    "node_modules/@ffmpeg/ffmpeg/node_modules/regenerator-runtime": {
+      "version": "0.13.11",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+    },
     "node_modules/@gar/promisify": {
       "version": "1.1.3",
       "resolved": "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz",

+ 16 - 36
src/components/pages/classroomObservation/components/baseMessage.vue

@@ -305,6 +305,7 @@
 		<previewVideoDialog ref="previewVideoDialogRef" />
 		<uploadFile v-if="progressData.uploadVideo" ref="uploadFileRef" @progressUpdate="videoProgressUpdate" @delUpload="videoDelUpload" @success="updateVideoSuccess" @startUpload="videoStartUpload"/>
 		<resourceLibraryDialog ref="resourceLibraryDialogRef" @addFile="resourceLibraryDialogAddFile"/>
+		<iframe ref="iframeFFmpegRef"  allow="camera *; microphone *;display-capture;midi;encrypted-media;" src="https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/cocoroboffmpeg" v-show="false"></iframe><!--https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/cocoroboffmpeg  http://localhost:8080/#/cocoroboffmpeg-->
 	</div>
 </template>
 
@@ -314,13 +315,6 @@ import wordcloudEChart from './wordcloudEChart.vue'
 import uploadFile from './uploadFile.vue';
 import { v4 as uuidv4 } from "uuid";
 import resourceLibraryDialog from './resourceLibraryDialog.vue';
-import FFmpeg from "@ffmpeg/ffmpeg";
-const { createFFmpeg, fetchFile } = FFmpeg;
-
-const ffmpeg = createFFmpeg({
-	corePath: './static/ffmpeg/ffmpeg-core.js',//https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2Fffmpeg-core1731663083831.js   http://localhost:8081/ffmpeg-core.js
-	log: true,
-});
 
 const getFile = (url) => {
   return new Promise((resolve, reject) => {
@@ -881,7 +875,6 @@ ${this.data.editorBarData?this.data.editorBarData.content:""}
 		},
 		async getVideoVoice(obj){
 			if(this.loading)return this.$message.info("请稍等");
-			console.log(obj)
 			this.loading = true;
 			let _file = null;
 			if(obj.url){
@@ -902,34 +895,10 @@ ${this.data.editorBarData?this.data.editorBarData.content:""}
 			if (!_file) return this.$message.error("文件不存在");
 
 			try {
-				// 加载FFmpeg
-			if (!ffmpeg.isLoaded()) {
-				await ffmpeg.load();
-			}
-			
-			// 将视频文件加载到FFmpeg
-			ffmpeg.FS("writeFile", "input.mp4", await fetchFile(_file));
-			
-			// 提取音频
-			await ffmpeg.run(
-				"-i",
-				"input.mp4",
-				"-q:a",
-				"0",
-				"-map",
-				"a",
-				"output.mp3"
-			);
-			
-			// 从FFmpeg文件系统中读取音频文件
-			const data = ffmpeg.FS("readFile", "output.mp3");
-			// 创建音频URL
-      let audioBlob = new Blob([data.buffer], { type: "audio/mp3" });
-			audioBlob.name = "output.mp3"
-			this.$emit("getVideoAudioSuccess",audioBlob)
-			this.$message.success("提取音频成功")
-			this.loading = false;
-			console.log(data)
+				await this.$refs.iframeFFmpegRef.contentWindow.postMessage({type:'extractAudio',file:_file},'*');
+			// this.$message.success("提取音频成功")
+			// this.loading = false;
+			// console.log(data)
 			} catch (error) {
 				console.log(error);
 				this.$message.error("提取音频失败")
@@ -939,6 +908,17 @@ ${this.data.editorBarData?this.data.editorBarData.content:""}
 		}
 	},
 	mounted() {
+		window.addEventListener('message',(e)=>{
+			let _data = e.data;
+			if(_data.code === 0){
+				this.$message.success(_data.msg);
+				this.loading = false;
+				this.$emit("getVideoAudioSuccess",_data.file)
+			}else if(_data.code === 1){
+				this.$message.error(_data.msg);
+				this.loading = false;
+			}
+		})
 		// this.showNephogram();
 	},
 };

+ 2 - 2
src/components/pages/classroomObservation/components/chatArea.vue

@@ -821,8 +821,8 @@ export default {
         // this.uploadWavFileAndGetText(file);
       };
     },
-		getVideoAudioSuccess(audioBlob){
-			this.uploadFile(audioBlob, { changeText: true, flag: true });
+		getVideoAudioSuccess(file){
+			this.uploadFile(file, { changeText: true, flag: true });
 		},
     cutBar(val) {
       this.pageStatus = val;

+ 2 - 2
src/components/pages/classroomObservation/components/messageArea.vue

@@ -205,8 +205,8 @@ export default {
     // },
   },
   methods: {
-		getVideoAudioSuccess(audioBlob){
-			this.$emit("getVideoAudioSuccess",audioBlob)
+		getVideoAudioSuccess(file){
+			this.$emit("getVideoAudioSuccess",file)
 		},
     // 绑定表单
     bindingForm(obj) {

+ 2 - 2
src/components/pages/classroomObservation/index.vue

@@ -1200,8 +1200,8 @@ export default {
       }
       return formattedTime;
     },
-		getVideoAudioSuccess(audioBlob){
-			this.$refs.chatAreaRef.getVideoAudioSuccess(audioBlob)
+		getVideoAudioSuccess(file){
+			this.$refs.chatAreaRef.getVideoAudioSuccess(file)
 		}
   },
   mounted() {

+ 95 - 0
src/components/pages/cocoroboffmpeg/index.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="ffmpeg">
+		<input type="file" @change="onFileChange" accept="video/mp4" />
+		<button @click="extractAudio()" :disabled="!videoFile">提取音频</button>
+		<audio v-if="audioUrl" :src="audioUrl" controls></audio>
+	</div>
+</template>
+
+<script>
+import FFmpeg from "@ffmpeg/ffmpeg";
+const { createFFmpeg, fetchFile } = FFmpeg;
+
+const ffmpeg = createFFmpeg({
+	corePath: './static/ffmpeg/ffmpeg-core.js',
+	log: true,
+});
+
+export default {
+	data() {
+		return {
+			videoFile: null,
+			audioUrl: null
+		};
+	},
+	methods: {
+		async onFileChange(event){
+			this.videoFile = event.target.files[0];
+		},
+		async extractAudio(file) {//提取音频
+			return new Promise(async(resolve) => {
+				try {
+					file = file || this.videoFile;
+					if (!file){
+						window.parent.postMessage({code:1,msg:'请选择视频文件'},'*');
+						resolve({code:1,msg:'请选择视频文件'});
+						return;
+					};
+
+					// 加载FFmpeg
+					if (!ffmpeg.isLoaded()) {
+						await ffmpeg.load();
+					}
+
+					// 将视频文件加载到FFmpeg
+					ffmpeg.FS("writeFile", "input.mp4", await fetchFile(file));
+
+					// 提取音频
+					await ffmpeg.run(
+						"-i",
+							"input.mp4",
+							"-q:a",
+							"0",
+							"-map",
+							"a",
+							"output.mp3"
+					);
+
+					// 从FFmpeg文件系统中读取音频文件
+					const data = ffmpeg.FS("readFile", "output.mp3");
+
+					// 创建音频URL
+					let audioBlob = new Blob([data.buffer], { type: "audio/mp3" });
+					audioBlob.name = "output.mp3"
+					if(this.videoFile){
+						this.audioUrl = URL.createObjectURL(audioBlob);
+					}
+					let resultFile = new File([audioBlob], "output.mp3", { type: "audio/mp3" });
+					window.parent.postMessage({code:0,msg:'提取音频成功',file:resultFile},'*');
+					resolve({file:audioBlob});
+				} catch (error) {
+					console.log(error);
+					window.parent.postMessage({code:1,msg:'提取音频失败',error:error},'*');
+					resolve({code:1,msg:'提取音频失败',error:error});
+				}
+			})
+		},
+	},
+	mounted(){
+		window.addEventListener('message',(e)=>{
+			let _data = e.data;
+			if(_data.type === 'extractAudio'){
+				this.extractAudio(_data.file);
+			}
+		})
+	}
+};
+</script>
+
+<style scoped>
+.ffmpeg {
+  width: 100vw;
+  height: 100vh;
+  background-color: #fff;
+}
+</style>

+ 145 - 140
src/components/pages/components/exportDataDialog.vue

@@ -2402,7 +2402,7 @@ export default {
           realData[5].per += `任务${index + 1}:${e},`;
         });
         this.claScoFoldLineData.forEach((e, index) => {
-          realData[5].cla += `任务${index + 1}:${e[2]},`;
+          realData[5].cla += `任务${index + 1}:${e},`;
         });
 
         // console.log("realData", realData);
@@ -2749,7 +2749,7 @@ export default {
         realData[5].per += `任务${index + 1}:${e},`;
       });
       this.claScoFoldLineData.forEach((e, index) => {
-        realData[5].cla += `任务${index + 1}:${e[2]},`;
+        realData[5].cla += `任务${index + 1}:${e},`;
       });
 
       console.log("realData", realData);
@@ -3044,7 +3044,7 @@ export default {
 
       this.stageList.forEach((e, index) => {
         repeatWorkCopy[index] = [];
-        scoList[index] = [index,0];
+        scoList[index] = 0;
       });
 
       // 将作业进行阶段分类
@@ -3054,12 +3054,12 @@ export default {
 
       repeatWorkCopy.forEach((e, index) => {
         e.forEach(k => {
-          scoList[index][1] += k.sco * 1;
+          scoList[index] += k.sco * 1;
         });
-        if (scoList[index][1] == 0) {
-          scoList[index][1] = 0;
+        if (scoList[index] == 0) {
+          scoList[index] = 0;
         } else {
-          scoList[index][1] = (scoList[index][1] / e.length).toFixed(1);
+          scoList[index] = (scoList[index] / e.length).toFixed(1);
         }
       });
 
@@ -3067,7 +3067,7 @@ export default {
 
       let zSco = 0;
       this.scoFoldLineData.forEach(e => {
-        zSco += e[1] * 1;
+        zSco += e * 1;
       });
 
       this.star = (zSco / this.scoFoldLineData.length).toFixed(1);
@@ -3108,45 +3108,45 @@ export default {
 
       let repeatWorkCopy = []; // 任务分类作业容器
       let scoList = []; //分数每个任务的所有任务分的集合
-      let blockData = []; //盒须图数据
-      this.claScoFoldLineData = []
-      let scoNum = []// 每个任务下的分数集合
+      // let blockData = []; //盒须图数据
+      // this.claScoFoldLineData = []
+      // let scoNum = []// 每个任务下的分数集合
 
       this.stageList.forEach((e, index) => {
         repeatWorkCopy[index] = [];
         scoList[index] = 0;
-        blockData[index] = []
-        scoNum[index] = []
-        this.claScoFoldLineData[index] = [0,0,0,0,0]
+        // blockData[index] = []
+        // scoNum[index] = []
+        // this.claScoFoldLineData[index] = [0,0,0,0,0]
       });
 
 
       // 将作业进行阶段分类
       repeatWork.forEach(e => {
         repeatWorkCopy[e.task].push(e);
-        scoNum[e.task].push(e.sco * 1);
+        // scoNum[e.task].push(e.sco * 1);
       });
 
       console.log('repeatWorkCopy',JSON.parse(JSON.stringify(repeatWorkCopy)));
 
-      scoNum.forEach((e,i)=>{
-        if (e.length < (toolNum[i].length * this.data12[0].num)) {
-          e = this.padArrayWithZeros(e,(toolNum[i].length * this.data12[0].num))
-        }
-        e = e.sort((a, b) => a - b);
-        console.log('scoNum',e);
+      // scoNum.forEach((e,i)=>{
+      //   if (e.length < (toolNum[i].length * this.data12[0].num)) {
+      //     e = this.padArrayWithZeros(e,(toolNum[i].length * this.data12[0].num))
+      //   }
+      //   e = e.sort((a, b) => a - b);
+      //   console.log('scoNum',e);
         
 
-        let sco2 = (e.length * 0.25).toFixed(0)
-        let sco3 = (e.length * 0.75).toFixed(0)
-        console.log(sco2,sco3);
+      //   let sco2 = (e.length * 0.25).toFixed(0)
+      //   let sco3 = (e.length * 0.75).toFixed(0)
+      //   console.log(sco2,sco3);
         
 
-        this.claScoFoldLineData[i][0] = e[0]
-        this.claScoFoldLineData[i][1] = e[sco2]
-        this.claScoFoldLineData[i][3] = e[sco3] //
-        this.claScoFoldLineData[i][4] = e[e.length-1]
-      })
+      //   this.claScoFoldLineData[i][0] = e[0]
+      //   this.claScoFoldLineData[i][1] = e[sco2]
+      //   this.claScoFoldLineData[i][3] = e[sco3] //
+      //   this.claScoFoldLineData[i][4] = e[e.length-1]
+      // })
 
 
       repeatWorkCopy.forEach((e, index) => {
@@ -3160,12 +3160,12 @@ export default {
         } else {
         
           //所有任务得分 =  任务得分 / 人数
-          scoList[index] = (scoList[index] / (this.data12[0].num * toolNum[index].length).toFixed(1));
+          scoList[index] = (scoList[index] / (this.data12[0].num * toolNum[index].length));
         }
       });
 
       scoList.forEach((e,i)=>{
-        this.claScoFoldLineData[i][2] = e
+        this.claScoFoldLineData[i] = e.toFixed(1)
       })
 
       console.log('this.claScoFoldLineData',this.claScoFoldLineData);
@@ -3389,76 +3389,15 @@ export default {
     // 任务成绩
     initChart2() {
       const chart = echarts.init(this.$refs.cScoEcharts);
-      let boxData =this.claScoFoldLineData;
+      // let boxData =this.claScoFoldLineData;
 
-      let scatterData = this.scoFoldLineData;
+      // let scatterData = this.scoFoldLineData;
 
       // console.log('boxData', boxData);
       // console.log('scatterData', scatterData);
 
       
-      // const option = {
-      //   title: {
-      //     text: "任务成绩",
-      //     left: "left",
-      //     textStyle: {
-      //       color: "rgba(140, 140, 140, 1)", // 标题颜色
-      //       fontSize: 10, // 标题字体大小
-      //       fontWeight: "bold" // 加粗样式
-      //     }
-      //   },
-      //   tooltip: {
-      //     trigger: "axis"
-      //     // formatter: "{b} : {c}"
-      //   },
-      //   legend: {
-      //     data: ["个人数据", "班级平均值"],
-      //     // align: "right",
-      //     orient: "vertical", // 设置为垂直排列
-      //     right: 10
-      //   },
-      //   xAxis: {
-      //     type: "category",
-      //     data: this.stageList.map(item => item),
-      //     axisTick: {
-      //       alignWithLabel: true // 使刻度线和标签对齐
-      //     }
-      //   },
-      //   yAxis: {
-      //     type: "value",
-      //     axisLabel: {
-      //       formatter: "{value}"
-      //     },
-      //     max: 5
-      //   },
-      //   series: [
-      //     {
-      //       name: "个人数据",
-      //       data: this.scoFoldLineData.map(item => item),
-      //       type: "line",
-      //       symbol: "circle",
-      //       symbolSize: 5,
-      //       lineStyle: {
-      //         opacity: 1 // 设置透明度为1,即不透明
-      //       }
-      //     },
-      //     {
-      //       name: "班级平均值",
-      //       data: this.claScoFoldLineData.map(item => item),
-      //       type: "line",
-      //       symbol: "circle",
-      //       symbolSize: 5,
-      //       lineStyle: {
-      //         opacity: 1 // 设置透明度为1,即不透明
-      //       }
-      //     }
-      //     // {
-      //     //   data: this.scoFoldLineData.map(item => item),
-      //     //   type: "line"
-      //     // }
-      //   ]
-      // };
-      let option = {
+      const option = {
         title: {
           text: "任务成绩",
           left: "left",
@@ -3468,62 +3407,123 @@ export default {
             fontWeight: "bold" // 加粗样式
           }
         },
+        tooltip: {
+          trigger: "axis"
+          // formatter: "{b} : {c}"
+        },
         legend: {
-          data: ["个人数据", "班级数据"],
+          data: ["个人数据", "班级平均值"],
           // align: "right",
-          orient:  "vertical", // 设置为垂直排列
+          orient: "vertical", // 设置为垂直排列
           right: 10
         },
-        tooltip: {
-          trigger: "item",
-          axisPointer: {
-            type: "shadow",
-          },
+        xAxis: {
+          type: "category",
+          data: this.stageList.map(item => item),
+          axisTick: {
+            alignWithLabel: true // 使刻度线和标签对齐
+          }
         },
-        xAxis: [
-          {
-            type: "category",
-            data: this.stageList.map(item => item),
-          },
-          
-        ],
-        yAxis: [
-          {
-            type: "value",
-            max: 5
+        yAxis: {
+          type: "value",
+          axisLabel: {
+            formatter: "{value}"
           },
-        ],
+          max: 5
+        },
         series: [
-          {
-            name: "班级数据",
-            type: "boxplot",
-            data: boxData,
-          },
           {
             name: "个人数据",
-            type: "scatter",
-            data: scatterData,
-            itemStyle: {
-              color: function (params) {
-                // 获取当前散点的 X 轴值
-                let xValue = params.value[0];
-                // 获取相应 X 轴位置的盒须图数据的最小值
-                let boxMinValue = boxData[xValue][1];
-                let boxMinValue2 = boxData[xValue][3];
-
-                // 判断散点是否低于盒须图的最小值,低于的话显示红色
-                if (params.value[1] < boxMinValue) {
-                  return "red";
-                } else if( params.value[1] >= boxMinValue2 ){
-                  return "green";
-                }else{
-                  return "yellow";
-                }
-              },
-            },
+            data: this.scoFoldLineData.map(item => item),
+            type: "line",
+            symbol: "circle",
+            symbolSize: 5,
+            lineStyle: {
+              opacity: 1 // 设置透明度为1,即不透明
+            }
           },
-        ],
+          {
+            name: "班级平均值",
+            data: this.claScoFoldLineData.map(item => item),
+            type: "line",
+            symbol: "circle",
+            symbolSize: 5,
+            lineStyle: {
+              opacity: 1 // 设置透明度为1,即不透明
+            }
+          }
+          // {
+          //   data: this.scoFoldLineData.map(item => item),
+          //   type: "line"
+          // }
+        ]
       };
+      // let option = {
+      //   title: {
+      //     text: "任务成绩",
+      //     left: "left",
+      //     textStyle: {
+      //       color: "rgba(140, 140, 140, 1)", // 标题颜色
+      //       fontSize: 10, // 标题字体大小
+      //       fontWeight: "bold" // 加粗样式
+      //     }
+      //   },
+      //   legend: {
+      //     data: ["个人数据", "班级数据"],
+      //     // align: "right",
+      //     orient:  "vertical", // 设置为垂直排列
+      //     right: 10
+      //   },
+      //   tooltip: {
+      //     trigger: "item",
+      //     axisPointer: {
+      //       type: "shadow",
+      //     },
+      //   },
+      //   xAxis: [
+      //     {
+      //       type: "category",
+      //       data: this.stageList.map(item => item),
+      //     },
+          
+      //   ],
+      //   yAxis: [
+      //     {
+      //       type: "value",
+      //       max: 5
+      //     },
+      //   ],
+      //   series: [
+      //     {
+      //       name: "班级数据",
+      //       type: "boxplot",
+      //       data: boxData,
+      //     },
+      //     {
+      //       name: "个人数据",
+      //       type: "scatter",
+      //       data: scatterData,
+      //       itemStyle: {
+      //         color: function (params) {
+      //           // 获取当前散点的 X 轴值
+      //           let xValue = params.value[0];
+      //           // 获取相应 X 轴位置的盒须图数据的最小值
+      //           let boxMinValue = boxData[xValue][1];
+      //           let boxMinValue2 = boxData[xValue][3];
+
+      //           // 判断散点是否低于盒须图的最小值,低于的话显示红色
+      //           if (params.value[1] < boxMinValue) {
+      //             return "red";
+      //           } else if( params.value[1] >= boxMinValue2 ){
+      //             return "green";
+      //           }else{
+      //             return "yellow";
+      //           }
+      //         },
+      //       },
+      //     },
+      //   ],
+      // };
 
       chart.setOption(option);
 
@@ -4095,6 +4095,7 @@ export default {
 .coverPage {
   /* height: 840pt; */
   padding: 185px 8% 0;
+  box-sizing: border-box;
   background-color: #ccc;
   position: relative;
   background-image: url("../../../assets/icon/exportPdfworks/bcg1.svg"),
@@ -4164,10 +4165,14 @@ export default {
 }
 .txt >>> .el-select {
   width: 100%;
+  height: 100%;
 }
 .txt >>> .el-input__icon {
   line-height: 0;
 }
+.txt >>> .el-select>.el-input{
+  height: 100%;
+}
 .txt >>> .el-input--suffix .el-input__inner {
   text-align: center;
   color: #000;

+ 57 - 41
src/components/pages/components/exportWorksDialog.vue

@@ -584,68 +584,78 @@
                   </div>
                 </div>
               </div>
-              <!-- 阶段作业得分  -->
+             
+              <!-- 阶段  -->
               <div
-                class="taskSco"
                 v-if="
-                  k.toolEList[0].content &&
-                    k.toolEList[0].content.length &&
-                    k.toolEList[0].eList &&
-                    CState != 5
+                    l.eList &&
+                    l.eList.length &&
+                    CState != 5 && 
+                    lind == k.toolEList.length - 1
                 "
+                class="taskSco"
               >
                 <div class="taskScoTit">
                   <div>
-                    任务得分:<span style="color: rgba(242, 161, 75, 1)">{{
+                    作业得分:<span style="color: rgba(242, 161, 75, 1)">{{
                       totalScore(k.toolEList[0].rate)
                     }}</span>
                   </div>
-                  <div>提交时间:{{ k.toolEList[0].time }}</div>
+                  <div>提交时间:{{ l.time }}</div>
                 </div>
 
                 <!-- 作业评分 -->
                 <div class="taskScoCon">
                   <!-- 分数详情与素养 -->
-                  <div
-                    v-if="k.toolEList[0].eList"
-                    class="taskScoConEList"
-                    style="flex: 1;display: flex;"
-                  >
-                    <div style="width: 49%; margin: 0 20px 10px 0">
+                  <div style="flex: 1; display: flex; flex-wrap: wrap">
+                    <div style="width: 375px; margin:0 20px 10px 0">
                       <div class="taskScoConTit">分数详情</div>
-                      <div style="display: flex;flex-wrap: wrap;">
+                      <div
+                        v-for="(wItem, ind) in l.eList"
+                        :key="ind + 's'"
+                        class="score_box"
+                        style="width: 100%"
+                      >
                         <div
-                          v-for="(wItem, ind) in k.toolEList[0].eList"
-                          :key="ind + 's'"
-                          class="score_box"
+                          style="
+                                display: flex;
+                                justify-content: space-between;
+                                align-items: center;
+                                width: 100%;
+                                min-width: 48%;
+                              "
                         >
                           <div class="RootImgBlock">
-                            <div>{{ wItem.value }}</div>
+                            {{ wItem.value }}
                           </div>
+
                           <el-rate
                             class="rate_size"
-                            style="width: 120px;display: flex;flex-shrink: 0;"
+                            disabled-void-color="#ccc"
+                            disabled
+                            style="width: 130px"
                             v-model="k.toolEList[0].rate[wItem.value]"
-                            @change="updateRate(i.id, k.task, 0)"
                           ></el-rate>
                         </div>
                       </div>
                     </div>
 
-                    <div
-                      v-if="k.toolEList[0].eList"
-                      style="width: 49%;display: flex;flex-direction: column;"
-                    >
+                    <div style="flex: 1">
                       <div class="taskScoConTit">素养</div>
                       <div class="WorkConSY">
-                        <div
-                          v-for="(wItem, ind) in k.toolEList[0].eList"
-                          :key="ind + 's'"
-                        >
-                          <div class="RootImgBlockSy">
-                            {{ wItem.target[wItem.target.length - 1] }}
-                          </div>
+                        <div v-for="(wItem, ind) in l.eList" :key="ind + 's'">
+                          <el-tooltip
+                            class="item"
+                            effect="dark"
+                            :content="wItem.target[wItem.target.length - 1]"
+                            placement="top-start"
+                          >
+                            <div class="RootImgBlockSy">
+                              <span v-if="wItem.target && wItem.target.length"> {{ wItem.target[wItem.target.length - 1] }}</span>
+                              <span v-else> {{ wItem.target }}</span>
+                            </div>
+                          </el-tooltip>
                         </div>
                       </div>
                     </div>
@@ -654,26 +664,24 @@
                   <!-- 评语 -->
                   <div
                     style="
-                          width: 48%;
+                          flex: 1;
+                          flex-shrink: 0;
                           display: flex;
                           flex-direction: column;
                           margin-left: 10px;
                         "
-                    v-if="
-                      k.toolEList[0].rate.content || k.toolEList[0].rate.comment
-                    "
+                    v-if="l.rate.content"
                   >
                     <div class="taskScoConTit">评语</div>
                     <div class="WorkCon">
-                      {{
-                        k.toolEList[0].rate.content ||
-                          k.toolEList[0].rate.comment
-                      }}
+                      {{ l.rate.content }}
                     </div>
                   </div>
                 </div>
               </div>
+
             </div>
+          
             <!-- 思维导图 -->
             <div v-if="CState == 5" class="taskTitInd">
               <div></div>
@@ -780,12 +788,15 @@ export default {
     totalScore() {
       return function(val) {
         let valT = JSON.parse(JSON.stringify(val));
+        
         if (!valT) return "0.0";
 
         delete valT.content;
         delete valT.comment;
+        console.log('valT',JSON.parse(JSON.stringify(val)));
 
         let data = Object.values(valT);
+        console.log('data',JSON.parse(JSON.stringify(data)));
 
         let new1 = data.reduce(function(pre, next, index) {
           return pre + next * 1;
@@ -1023,11 +1034,16 @@ export default {
                     }
                   });
                   // 将没有提交作业,但是有评分标准的数据填上数据,防止报错
-                  if (!l.rate && l.eList && l.eList.length) {
+                  if (!l.rate && l.eList && l.eList.length && this.CState == 5) {
                     l.rate = { content: "" };
                     l.eList.forEach(elp => {
                       l.rate[elp.detail] = 0;
                     });
+                  }else if ((!l.rate && l.eList && l.eList.length && this.CState != 5)) {
+                      l.rate = { content: "" };
+                      l.eList.forEach(elp => {
+                        l.rate[elp.value] = 0;
+                      });
                   }
                   // 将素养添加进treeData中
                   if (l.eList && l.eList.length) {

+ 95 - 91
src/components/pages/components/lookWork.vue

@@ -2,12 +2,12 @@
   <div class="pbl" v-loading="loading">
     <div class="titBri">
       <div class="claInfo">
-        <img v-if="userImg" :src="userImg" alt="" />
-        <img
+        <img style="height: 100%;" src="../../../assets/avatar.png" alt="" />
+        <!-- <img
           v-else
           src="https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/static/img/portal.b3cf7fa.png"
           alt=""
-        />
+        /> -->
         <span>{{ userName }}</span>
         <span>{{ courseName }}</span>
         <el-button size="small" type="primary" style="margin-left: 10px;height: 25px;line-height: 8px;" @click="expPdf">导出</el-button>
@@ -576,97 +576,87 @@
                       </div>
                     </div>
                   </div>
+                  
                 </div>
-              </div>
-              <!-- 阶段作业得分  -->
-              <div
-                class="taskSco"
-                v-if="
-                  k.toolEList[0].content &&
-                    k.toolEList[0].content.length &&
-                    k.toolEList[0].eList &&
-                    CState != 5
-                "
-              >
-                <div class="taskScoTit">
-                  <div>
-                    任务得分:<span style="color: rgba(242, 161, 75, 1)">{{
-                      totalScore(k.toolEList[0].rate)
-                    }}</span>
-                    分
+
+                <!-- 阶段  -->
+                <div
+                  class="taskSco"
+                  v-if="l.eList && CState != 5 && lind == k.toolEList.length - 1"
+                >
+                  <div class="taskScoTit">
+                    <div>
+                      作业得分:<span style="color: rgba(242, 161, 75, 1)">{{
+                        totalScore(k.toolEList[0].rate)
+                      }}</span>
+                      分
+                    </div>
+                    <div>提交时间:{{ l.time }}</div>
                   </div>
-                  <div>提交时间:{{ k.toolEList[0].time }}</div>
-                </div>
 
-                <!-- 作业评分 -->
-                <div class="taskScoCon">
-                  <!-- 分数详情与素养 -->
-                  <div
-                    v-if="k.toolEList[0].eList"
-                    class="taskScoConEList"
-                    style="width:100%"
-                  >
-                    <div style="width: 49%; margin: 0 20px 10px 0">
-                      <div class="taskScoConTit">分数详情</div>
-                      <div style="display: flex;flex-wrap: wrap;">
-                        <div
-                          v-for="(wItem, ind) in k.toolEList[0].eList"
-                          :key="ind + 's'"
-                          class="score_box"
-                        >
-                          <div class="RootImgBlock">
-                            <div>{{ wItem.value }}</div>
+                  <!-- 作业评分 -->
+                  <div class="taskScoCon">
+                    <!-- 分数详情与素养 -->
+                    <div
+                      v-if="l.eList"
+                      class="taskScoConEList"
+                    >
+                      <div style="width: 49%; margin: 0 20px 10px 0">
+                        <div class="taskScoConTit">分数详情</div>
+                        <div style="display: flex;flex-wrap: wrap;">
+                          <div
+                            v-for="(wItem, ind) in l.eList"
+                            :key="ind + 's'"
+                            class="score_box"
+                          >
+                            <div class="RootImgBlock">
+                              <div>{{ wItem.value }}</div>
+                            </div>
+
+                            <el-rate
+                              class="rate_size"
+                              style="width: 120px;display: flex;flex-shrink: 0;"
+                              v-model="k.toolEList[0].rate[wItem.value]"
+                              @change="updateRate(i.id, k.task, 0)"
+                            ></el-rate>
                           </div>
-                          <el-rate
-                            class="rate_size"
-                            style="width: 120px;display: flex;flex-shrink: 0;"
-                            v-model="k.toolEList[0].rate[wItem.value]"
-                            @change="updateRate(i.id, k.task, 0)"
-                          ></el-rate>
                         </div>
                       </div>
-                    </div>
 
-                    <div
-                      v-if="k.toolEList[0].eList"
-                      style="width: 49%;display: flex;flex-direction: column;"
-                    >
-                      <div class="taskScoConTit">素养</div>
-                      <div class="WorkConSY">
-                        <div
-                          v-for="(wItem, ind) in k.toolEList[0].eList"
-                          :key="ind + 's'"
-                        >
-                          <div class="RootImgBlockSy">
-                            {{ wItem.target[wItem.target.length - 1] }}
+                      <div
+                        v-if="l.eList"
+                        style="width: 49%;display: flex;flex-direction: column;"
+                      >
+                        <div class="taskScoConTit">素养</div>
+                        <div class="WorkConSY">
+                          <div v-for="(wItem, ind) in l.eList" :key="ind + 's'">
+                            <div class="RootImgBlockSy">
+                              <span v-if="wItem.target && wItem.target.length"> {{ wItem.target[wItem.target.length - 1] }}</span>
+                              <span v-else> {{ wItem.target }}</span>
+                            </div>
                           </div>
                         </div>
                       </div>
                     </div>
-                  </div>
 
-                  <!-- 评语 -->
-                  <div
-                    style="
+                    <!-- 评语 -->
+                    <div
+                      style="
                           width: 40%;
                           display: flex;
                           flex-direction: column;
                           margin-left: 10px;
                         "
-                    v-if="
-                      k.toolEList[0].rate.content || k.toolEList[0].rate.comment
-                    "
-                  >
-                    <div class="taskScoConTit">评语</div>
-                    <div class="WorkCon">
-                      {{
-                        k.toolEList[0].rate.content ||
-                          k.toolEList[0].rate.comment
-                      }}
+                      v-if="l.rate.content || l.rate.comment"
+                    >
+                      <div class="taskScoConTit">评语</div>
+                      <div class="WorkCon">
+                        {{ l.rate.content || l.rate.comment }}
+                      </div>
                     </div>
-                  </div>
+                  </div>      
                 </div>
-              </div>
+              </div>  
             </div>
           </div>
         </div>
@@ -767,11 +757,11 @@ export default {
     this.cid = JSON.parse(JSON.stringify(this.id));
     this.uid = JSON.parse(JSON.stringify(this.studentId));
 
-    if (this.isStu == 0) {
+    // if (this.isStu == 0) {
       this.getWorks1();
-    } else {
-      this.exportPdfSet();
-    }
+    // } else {
+      // this.exportPdfSet();
+    // }
   },
   watch: {
     studentId(newL, oldL) {
@@ -780,11 +770,11 @@ export default {
       this.cid = JSON.parse(JSON.stringify(this.id));
       this.uid = JSON.parse(JSON.stringify(this.studentId));
 
-      if (this.isStu == 0) {
+      // if (this.isStu == 0) {
         this.getWorks1();
-      } else {
-        this.exportPdfSet();
-      }
+      // } else {
+        // this.exportPdfSet();
+      // }
     }
   },
   methods: {
@@ -808,8 +798,7 @@ export default {
       let processedData = this.workList[stage].taskList[task].toolEList[tool]
         .rate;
       console.log("processedData", processedData);
-
-      console.log(stage, task, tool);
+      // console.log(stage, task, tool);
       let params = {
         cid: this.cid,
         s: stage,
@@ -883,13 +872,15 @@ export default {
             var wordInfo = res.data[12]; //文档作业
             this.workEvaList = res.data[13];
 
-            console.log('res.data[0][0]',res.data[0][0]);
+            // console.log('res.data[0][0]',res.data[0][0]);
             this.resData = JSON.parse(JSON.stringify(res.data[0][0]))
             
             this.courseName = res.data[0][0].course;
             this.CState = res.data[0][0].state;
 
             var dyJSON = JSON.parse(res.data[0][0].chapters);
+            // console.log('dyJSON',JSON.parse(JSON.stringify(dyJSON)));
+            
 
             let dyList = [];
             for (var i = 0; i < dyJSON.length; i++) {
@@ -904,14 +895,14 @@ export default {
               }
             }
             this.dyList = dyList;
-            console.log("this.dyList", this.dyList);
+            // console.log("this.dyList", this.dyList);
 
             // console.log("this.workEvaList", this.workEvaList);
 
             let framework = [];
             if (res.data[0].length) {
               let elistData = JSON.parse(res.data[0][0].chapters);
-              console.log("elistData", JSON.parse(JSON.stringify(elistData)));
+              // console.log("elistData", JSON.parse(JSON.stringify(elistData)));
 
               elistData.forEach((e, i) => {
                 framework[i] = {
@@ -996,7 +987,7 @@ export default {
             AreaAllWork.sort(function(a, b) {
               return a.stage - b.stage; //从小到大排序
             });
-            console.log("AreaAllWork", JSON.parse(JSON.stringify(AreaAllWork)));
+            // console.log("AreaAllWork", JSON.parse(JSON.stringify(AreaAllWork)));
 
             framework.forEach(e => {
               e.taskList.forEach((k, kin) => {
@@ -1027,7 +1018,7 @@ export default {
                       k.task == p.task &&
                       lIndex == p.tool
                     ) {
-                      // console.log("JSON.parse(p.rate)", JSON.parse(p.rate));
+                      console.log("JSON.parse(p.rate)", JSON.parse(p.rate));
                       let rateCopy = JSON.parse(p.rate);
                       for (const key in rateCopy) {
                         if (key != "content") {
@@ -1038,12 +1029,25 @@ export default {
                     }
                   });
 
-                  if (!l.rate && l.eList && l.eList.length) {
+                  // 将没有提交作业,但是有评分标准的数据填上数据,防止报错
+                  if (!l.rate && l.eList && l.eList.length && this.CState == 5) {
                     l.rate = { content: "" };
                     l.eList.forEach(elp => {
                       l.rate[elp.detail] = 0;
                     });
+                  }else if ((!l.rate && l.eList && l.eList.length && this.CState != 5)) {
+                      l.rate = { content: "" };
+                      l.eList.forEach(elp => {
+                        l.rate[elp.value] = 0;
+                      });
                   }
+                // }
+                  // if (!l.rate && l.eList && l.eList.length) {
+                  //   l.rate = { content: "" };
+                  //   l.eList.forEach(elp => {
+                  //     l.rate[elp.detail] = 0;
+                  //   });
+                  // }
                 });
               });
             });

+ 8 - 0
src/components/pages/course.vue

@@ -263,6 +263,14 @@
                 " @click="goToCourse5(item.courseId)">
 									<img src="../../assets/icon/course/edit.svg">
 								</div>
+
+                <div class="t_b_Item" v-if="((item.userid == userid) ||
+                (item.course_teacher &&
+                  item.course_teacher.indexOf(userid) !== -1) || role == '1') &&
+                item.state == 6
+                " @click="goToCourse3(item.courseId)">
+									<img src="../../assets/icon/course/edit.svg">
+								</div>
     					</el-tooltip>
 
 							<el-tooltip effect="dark" content="删除" placement="top" v-if="item.isCourseType == 1 || role == '1'">

+ 23 - 26
src/components/pages/trainCourse/course.vue

@@ -90,8 +90,7 @@
           <span><span>类型</span></span>
           <el-radio-group v-model="pTypeCheckName" style="display: flex; align-items: center">
             <div class="all_choose" style="width: 100px" v-for="(item, index) in CourseType2" :key="index">
-              <el-radio :label="item.name" @click.native.prevent="CourseType2Click(item.name)">{{ item.name
-                }}</el-radio>
+              <el-radio :label="item.name" @click.native.prevent="CourseType2Click(item.name)">{{ item.name }}</el-radio>
             </div>
           </el-radio-group>
         </div>
@@ -102,12 +101,12 @@
               (oid == '69893dca-1d47-11ed-8c78-005056b86db5'
                 ? pTypeCheck.indexOf(item.id) != -1
                 : true)
-            "><span>{{ item.name }}</span></span>
+              "><span>{{ item.name }}</span></span>
             <div class="typeCss" v-if="CourseTypeJson[item.id].length &&
               (oid == '69893dca-1d47-11ed-8c78-005056b86db5'
                 ? pTypeCheck.indexOf(item.id) != -1
                 : true)
-            ">
+              ">
               <div class="cName" @click="getCourse2(item.name, '', item.id, 1)"
                 :class="typeE.indexOf(item.id) != -1 ? 'isCType' : ''">
                 全部
@@ -201,7 +200,7 @@
             <div class="myCourse" style="background: #4187f0" v-else-if="!item.course_teacher ||
               (item.course_teacher &&
                 item.course_teacher.indexOf(userid) == -1)
-            ">
+              ">
               他人培训
             </div>
             <div class="xtCourse" v-else>协同培训</div>
@@ -246,21 +245,21 @@
                 (item.course_teacher &&
                   item.course_teacher.indexOf(userid) !== -1) || role == '1') &&
                 item.state == 1
-              " @click="goToCourse(item.courseId)">
+                " @click="goToCourse(item.courseId)">
                 修改
               </div>
               <div v-if="((item.userid == userid) ||
                 (item.course_teacher &&
                   item.course_teacher.indexOf(userid) !== -1) || role == '1') &&
                 item.state == 2
-              " @click="goToCourse(item.courseId)">
+                " @click="goToCourse(item.courseId)">
                 修改
               </div>
               <div v-if="((item.userid == userid) ||
                 (item.course_teacher &&
                   item.course_teacher.indexOf(userid) !== -1) || role == '1') &&
                 item.state == 3
-              " @click="goToCourse3(item.courseId)">
+                " @click="goToCourse3(item.courseId)">
                 修改
               </div>
               <!-- <div v-if="groupA == '0'" @click="
@@ -307,8 +306,8 @@
     <el-dialog :visible.sync="dialogVisible1" size="tiny">
       <img width="100%" :src="dialogImageUrl" alt />
     </el-dialog>
-    <el-dialog title="查看提问" :visible.sync="dialogVisible" :append-to-body="true" width="750px"
-      :before-close="handleClose" class="dialog_diy">
+    <el-dialog title="查看提问" :visible.sync="dialogVisible" :append-to-body="true" width="750px" :before-close="handleClose"
+      class="dialog_diy">
       <div>
         <div class="a_addBox">
           <CourseProblem :problemCourse="problemCourse"></CourseProblem>
@@ -425,20 +424,20 @@ export default {
     // 获取基础页面数据
     getPageBase() {
       let params = {
-        typ: 2,
-        org: this.org,
-        oid: this.oid
+          typ: 2,
+          org: this.org,
+          oid: this.oid
       };
       // console.log(params);
       this.ajax
-        .get(this.$store.state.api + "selectTestExamineBase", params)
-        .then(res => {
-          console.log('selectTestExamineBase', res.data[0]);
-          this.examineData = res.data[0]
-        })
-        .catch(error => {
+          .get(this.$store.state.api + "selectTestExamineBase", params)
+          .then(res => {
+              console.log('selectTestExamineBase',res.data[0]);
+              this.examineData=res.data[0]
+          })
+          .catch(error => {
           console.log(error);
-        });
+          });
     },
     change(val) {
       console.log(val);
@@ -1567,7 +1566,6 @@ export default {
   align-items: center;
   justify-content: space-between;
 }
-
 .kc_t>span:nth-child(1) {
   max-width: 100%;
   overflow: hidden;
@@ -1763,9 +1761,9 @@ export default {
   padding: 0 15px;
 }
 
-.sub_head+.subClick,
-.subClick+.subClick,
-.subClick+.sub_head {
+.sub_head + .subClick,
+.subClick + .subClick,
+.subClick + .sub_head{
   margin-left: 17.5px;
 }
 
@@ -2008,5 +2006,4 @@ export default {
 
 .buttonBox>div:hover {
   background: #f6f8ff;
-}
-</style>
+}</style>

+ 9 - 0
src/router/index.js

@@ -141,6 +141,7 @@ import pocDoTask from '@/components/pages/pocAiClassroom/doTask'
 import pocClass from '@/components/pages/pocAiClassroom/pocClass'
 import choseCheckTest from '@/components/pages/test/choseCheck'
 import testAi from '@/components/pages/testAi'
+import cocoroboffmpeg from '@/components/pages/cocoroboffmpeg'
 // 全局修改默认配置,点击空白处不能关闭弹窗
 ElementUI.Dialog.props.closeOnClickModal.default = false
 Vue.use(Router).use(ElementUI)
@@ -1215,5 +1216,13 @@ export default new Router({
 						requireAuth:''//不需要鉴权
 					}
 				},
+				{
+					path:"/cocoroboffmpeg",
+					name:"cocoroboffmpeg",
+					component:cocoroboffmpeg,
+					meta:{
+						requireAuth:''//不需要鉴权
+					}
+				}
     ]
 })

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