Browse Source

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

root 2 years ago
parent
commit
b7a3bc11ba
35 changed files with 2163 additions and 531 deletions
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.9f64085c7724d2e9001275d9af9e00a5.css
  3. 0 0
      dist/static/css/app.9f64085c7724d2e9001275d9af9e00a5.css.map
  4. 0 0
      dist/static/css/app.f20b94dfd60048918ef9141a55d0461f.css
  5. 0 0
      dist/static/css/app.f20b94dfd60048918ef9141a55d0461f.css.map
  6. BIN
      dist/static/img/translation.cd5e907.png
  7. 0 0
      dist/static/js/0.495dd6dd7e801967b64f.js.map
  8. 0 0
      dist/static/js/0.86cbf9c691e3dc53b304.js
  9. 0 0
      dist/static/js/0.86cbf9c691e3dc53b304.js.map
  10. 0 0
      dist/static/js/app.d21feb28f78c899191a4.js
  11. 0 0
      dist/static/js/app.d21feb28f78c899191a4.js.map
  12. 0 0
      dist/static/js/app.ee275f0245b04b8ae5c8.js
  13. 0 0
      dist/static/js/app.ee275f0245b04b8ae5c8.js.map
  14. 2 2
      dist/static/js/manifest.85f48b0184f614b2b8d9.js
  15. 0 0
      dist/static/js/manifest.85f48b0184f614b2b8d9.js.map
  16. 0 0
      dist/static/js/vendor.10e66e02479f48f0abf1.js
  17. 0 0
      dist/static/js/vendor.10e66e02479f48f0abf1.js.map
  18. 18 0
      package-lock.json
  19. 2 0
      package.json
  20. 5 0
      src/App.vue
  21. BIN
      src/assets/icon/addEva.png
  22. BIN
      src/assets/icon/thirdToolList/translation.png
  23. 431 116
      src/components/pages/addCourse.vue
  24. 232 0
      src/components/pages/audioDemo.vue
  25. 39 13
      src/components/pages/classRoom.vue
  26. 98 5
      src/components/pages/components/answerData.vue
  27. 222 0
      src/components/pages/components/answerData2.vue
  28. 4 2
      src/components/pages/components/imgDraw/imgDraw.vue
  29. 12 1
      src/components/pages/components/pdf.vue
  30. 244 42
      src/components/pages/components/worksDetail2.vue
  31. 26 48
      src/components/pages/course.vue
  32. 4 0
      src/components/pages/evaluation.vue
  33. 616 102
      src/components/pages/liveRoom.vue
  34. 3 3
      src/main.js
  35. 204 196
      src/router/index.js

+ 1 - 1
dist/index.html

@@ -25,4 +25,4 @@
       height: 100%;
       width: 100%;
       background: #e6eaf0;
-    }</style><link href=./static/css/app.f20b94dfd60048918ef9141a55d0461f.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.39a9f69d36ef7d211bbe.js></script><script type=text/javascript src=./static/js/vendor.aae8f7d9cec68eff34fe.js></script><script type=text/javascript src=./static/js/app.d21feb28f78c899191a4.js></script></body></html><script>document.domain = document.domain.split(".").slice(-2).join(".");</script>
+    }</style><link href=./static/css/app.9f64085c7724d2e9001275d9af9e00a5.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.85f48b0184f614b2b8d9.js></script><script type=text/javascript src=./static/js/vendor.10e66e02479f48f0abf1.js></script><script type=text/javascript src=./static/js/app.ee275f0245b04b8ae5c8.js></script></body></html><script>document.domain = document.domain.split(".").slice(-2).join(".");</script>

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


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


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


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


BIN
dist/static/img/translation.cd5e907.png


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


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


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


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


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


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


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


+ 2 - 2
dist/static/js/manifest.39a9f69d36ef7d211bbe.js → dist/static/js/manifest.85f48b0184f614b2b8d9.js

@@ -1,2 +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={4: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:"495dd6dd7e801967b64f",1:"994623639438b244a74c"}[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.39a9f69d36ef7d211bbe.js.map
+!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={4: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:"86cbf9c691e3dc53b304",1:"994623639438b244a74c"}[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.85f48b0184f614b2b8d9.js.map

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


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


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


+ 18 - 0
package-lock.json

@@ -6143,6 +6143,11 @@
       "resolved": "https://registry.npm.taobao.org/jquery/download/jquery-3.6.0.tgz",
       "integrity": "sha1-xyoJ8Vwb3OFC9J2/EXC9+K2sJHA="
     },
+    "js-audio-recorder": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/js-audio-recorder/-/js-audio-recorder-1.0.7.tgz",
+      "integrity": "sha512-JiDODCElVHGrFyjGYwYyNi7zCbKk9va9C77w+zCPMmi4C6ix7zsX2h3ddHugmo4dOTOTCym9++b/wVW9nC0IaA=="
+    },
     "js-base64": {
       "version": "2.6.4",
       "resolved": "https://registry.npm.taobao.org/js-base64/download/js-base64-2.6.4.tgz?cache=0&sync_timestamp=1604450326544&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-base64%2Fdownload%2Fjs-base64-2.6.4.tgz",
@@ -6264,6 +6269,14 @@
         "is-buffer": "^1.1.5"
       }
     },
+    "lamejs": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/lamejs/-/lamejs-1.2.1.tgz",
+      "integrity": "sha512-s7bxvjvYthw6oPLCm5pFxvA84wUROODB8jEO2+CE1adhKgrIvVOlmMgY8zyugxGrvRaDHNJanOiS21/emty6dQ==",
+      "requires": {
+        "use-strict": "1.0.1"
+      }
+    },
     "last-call-webpack-plugin": {
       "version": "2.1.2",
       "resolved": "https://registry.npm.taobao.org/last-call-webpack-plugin/download/last-call-webpack-plugin-2.1.2.tgz",
@@ -13348,6 +13361,11 @@
       "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=",
       "dev": true
     },
+    "use-strict": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/use-strict/-/use-strict-1.0.1.tgz",
+      "integrity": "sha512-IeiWvvEXfW5ltKVMkxq6FvNf2LojMKvB2OCeja6+ct24S1XOmQw2dGr2JyndwACWAGJva9B7yPHwAmeA9QCqAQ=="
+    },
     "util": {
       "version": "0.11.1",
       "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil%2Fdownload%2Futil-0.11.1.tgz",

+ 2 - 0
package.json

@@ -19,8 +19,10 @@
     "hevue-img-preview": "^5.0.3",
     "html-docx-js": "^0.3.1",
     "jquery": "^3.6.0",
+    "js-audio-recorder": "^1.0.7",
     "js-pinyin": "^0.1.9",
     "jsmind": "^0.4.8",
+    "lamejs": "^1.2.1",
     "qs": "^6.10.1",
     "v-viewer": "^1.6.4",
     "vant": "^2.12.10",

+ 5 - 0
src/App.vue

@@ -6,6 +6,7 @@
         $route.path == '/data' ||
         $route.path == '/note' ||
         $route.path == '/works',
+      appNoHeight: $route.path == '/liveRoom',
     }"
   >
     <!-- <div class="app_head" :class="{stuWidth:$route.path == '/student'}"> -->
@@ -225,6 +226,10 @@ body {
   min-width: 550px;
 }
 
+.appNoHeight {
+  min-height: 750px;
+}
+
 .app_head {
   height: 67.5px;
   width: 100%;

BIN
src/assets/icon/addEva.png


BIN
src/assets/icon/thirdToolList/translation.png


File diff suppressed because it is too large
+ 431 - 116
src/components/pages/addCourse.vue


+ 232 - 0
src/components/pages/audioDemo.vue

@@ -0,0 +1,232 @@
+<template>
+  <div class="home" style="margin: 1vw">
+    <Button type="success" @click="getPermission()" style="margin: 1vw"
+      >获取麦克风权限</Button
+    >
+    <br />
+    <Button type="info" @click="startRecorder()" style="margin: 1vw"
+      >开始录音</Button
+    >
+    <Button type="info" @click="resumeRecorder()" style="margin: 1vw"
+      >继续录音</Button
+    >
+    <Button type="info" @click="pauseRecorder()" style="margin: 1vw"
+      >暂停录音</Button
+    >
+    <Button type="info" @click="stopRecorder()" style="margin: 1vw"
+      >结束录音</Button
+    >
+    <br />
+    <Button type="success" @click="playRecorder()" style="margin: 1vw"
+      >录音播放</Button
+    >
+    <Button type="success" @click="pausePlayRecorder()" style="margin: 1vw"
+      >暂停录音播放</Button
+    >
+    <Button type="success" @click="resumePlayRecorder()" style="margin: 1vw"
+      >恢复录音播放</Button
+    >
+    <Button type="success" @click="stopPlayRecorder()" style="margin: 1vw"
+      >停止录音播放</Button
+    >
+    <br />
+    <Button type="info" @click="getRecorder()" style="margin: 1vw"
+      >获取录音信息</Button
+    >
+    <Button type="info" @click="downPCM()" style="margin: 1vw">下载PCM</Button>
+    <Button type="info" @click="downWAV()" style="margin: 1vw">下载WAV</Button>
+    <Button type="info" @click="getMp3Data()" style="margin: 1vw"
+      >下载MP3</Button
+    >
+    <br />
+    <Button type="error" @click="destroyRecorder()" style="margin: 1vw"
+      >销毁录音</Button
+    >
+  </div>
+</template>
+
+ 
+<script>
+import Recorder from "js-audio-recorder";
+
+const lamejs = require("lamejs");
+
+const recorder = new Recorder({
+  sampleBits: 16, // 采样位数,支持 8 或 16,默认是16
+  sampleRate: 48000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000
+  numChannels: 1, // 声道,支持 1 或 2, 默认是1
+  // compiling: false,(0.x版本中生效,1.x增加中) // 是否边录边转换,默认是false
+});
+
+// 绑定事件-打印的是当前录音数据
+
+recorder.onprogress = function (params) {
+  // console.log('--------------START---------------')
+  // console.log('录音时长(秒)', params.duration);
+  // console.log('录音大小(字节)', params.fileSize);
+  // console.log('录音音量百分比(%)', params.vol);
+  // console.log('当前录音的总数据([DataView, DataView...])', params.data);
+  // console.log('--------------END---------------')
+};
+
+export default {
+  name: "home",
+  methods: {
+    /**
+     * 录音的具体操作功能
+     * */
+
+    // 开始录音
+    startRecorder() {
+      recorder.start().then(
+        () => {
+        },
+        (error) => {
+          // 出错了
+          console.log(`${error.name} : ${error.message}`);
+        }
+      );
+    },
+
+    // 继续录音
+    resumeRecorder() {
+      recorder.resume();
+    },
+    // 暂停录音
+    pauseRecorder() {
+      recorder.pause();
+    },
+    // 结束录音
+    stopRecorder() {
+      recorder.stop();
+    },
+
+    // 录音播放
+    playRecorder() {
+      recorder.play();
+    },
+
+    // 暂停录音播放
+    pausePlayRecorder() {
+      recorder.pausePlay();
+    },
+
+    // 恢复录音播放
+    resumePlayRecorder() {
+      recorder.resumePlay();
+    },
+
+    // 停止录音播放
+    stopPlayRecorder() {
+      recorder.stopPlay();
+    },
+
+    // 销毁录音
+    destroyRecorder() {
+      recorder.destroy();
+      //   .then(function () {
+      // recorder = null;
+      //   });
+    },
+
+    /**
+     * 获取录音文件
+     * */
+
+    getRecorder() {
+      let toltime = recorder.duration; //录音总时长
+      let fileSize = recorder.fileSize; //录音总大小
+      //录音结束,获取取录音数据
+      let PCMBlob = recorder.getPCMBlob(); //获取 PCM 数据
+      let wav = recorder.getWAVBlob(); //获取 WAV 数据
+      let channel = recorder.getChannelData(); //获取左声道和右声道音频数据
+      console.log(toltime);
+    //   debugger;
+    },
+
+    /**
+     * 下载录音文件
+     * */
+
+    //下载pcm
+
+    downPCM() {
+      //这里传参进去的时文件名
+      recorder.downloadPCM("新文件");
+    },
+
+    //下载wav
+
+    downWAV() {
+      //这里传参进去的时文件名
+      recorder.downloadWAV("新文件");
+    },
+
+    /**
+     * 获取麦克风权限
+     * */
+
+    getPermission() {
+      Recorder.getPermission().then(
+        () => {
+          this.$Message.success("获取权限成功");
+        },
+        (error) => {
+          console.log(`${error.name} : ${error.message}`);
+        }
+      );
+    },
+
+    /**
+     * 文件格式转换 wav-map3
+     * */
+
+    getMp3Data() {
+      const mp3Blob = this.convertToMp3(recorder.getWAV());
+      recorder.download(mp3Blob, "recorder", "mp3");
+    },
+
+    convertToMp3(wavDataView) {
+      // 获取wav头信息
+      const wav = lamejs.WavHeader.readHeader(wavDataView); // 此处其实可以不用去读wav头信息,毕竟有对应的config配置
+      const { channels, sampleRate } = wav;
+      const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128);
+      // 获取左右通道数据
+      const result = recorder.getChannelData();
+      const buffer = [];
+      const leftData =
+        result.left &&
+        new Int16Array(result.left.buffer, 0, result.left.byteLength / 2);
+      const rightData =
+        result.right &&
+        new Int16Array(result.right.buffer, 0, result.right.byteLength / 2);
+      const remaining = leftData.length + (rightData ? rightData.length : 0);
+      const maxSamples = 1152;
+      for (let i = 0; i < remaining; i += maxSamples) {
+        const left = leftData.subarray(i, i + maxSamples);
+        let right = null;
+        let mp3buf = null;
+        if (channels === 2) {
+          right = rightData.subarray(i, i + maxSamples);
+          mp3buf = mp3enc.encodeBuffer(left, right);
+        } else {
+          mp3buf = mp3enc.encodeBuffer(left);
+        }
+        if (mp3buf.length > 0) {
+          buffer.push(mp3buf);
+        }
+      }
+
+      const enc = mp3enc.flush();
+      if (enc.length > 0) {
+        buffer.push(enc);
+      }
+      return new Blob(buffer, { type: "audio/mp3" });
+    },
+  },
+};
+</script>
+
+ 
+<style  scoped>
+</style>

+ 39 - 13
src/components/pages/classRoom.vue

@@ -25,18 +25,15 @@
             <div class="tup">
               <img
                 :src="
-									item.cover != null && item.cover != ''
-										? JSON.parse(item.cover).length > 0
-											? JSON.parse(item.cover)[0].url
+									item.poster != null && item.poster != ''
+											? item.poster
 											: mr
-										: mr
 								"
                 alt
               />
             </div>
             <div class="bottom_box">
-              <div>{{ item.title }}</div>
-              <div class="kc_t" v-if="groupA == '1'">创建老师:{{ item.uname }}</div>
+              <div>{{ item.name }}</div>
               <div class="kc_time">{{ item.time }}</div>
             </div>
             <div class="three_bottom">
@@ -44,7 +41,7 @@
                 @click="
 									goTo(
 										'/liveRoom?cid=' +
-											item.courseId +
+											item.id +
 											'&userid=' +
 											userid +
 											'&oid=' +
@@ -112,12 +109,12 @@ export default {
       now: "",
       groupA: "0",
       course: [
-        {
-          cover: [],
-          courseId:"9a4e8dbe-132e-438e-97db-b07eb01fa04c",
-          title: "introduce a festival (Final)",
-          time: this.getNowTime(),
-        },
+        // {
+        //   cover: [],
+        //   courseId:"9a4e8dbe-132e-438e-97db-b07eb01fa04c",
+        //   title: "introduce a festival (Final)",
+        //   time: this.getNowTime(),
+        // },
       ],
       courseName: "",
       mr: require("../../assets/icon/pptImg2.png"),
@@ -143,6 +140,7 @@ export default {
     handleCurrentChange(val) {
       // console.log(`当前页: ${val}`);
       this.page = val;
+      this.getData();
     },
     init() {},
     handleClose(done) {
@@ -189,6 +187,7 @@ export default {
     },
     searchCourse() {
       this.page = 1;
+      this.getData();
     },
     // deleteCourse(cid) {
     //   const loading = this.openLoading(
@@ -215,9 +214,36 @@ export default {
     search() {
       this.page = 1;
     },
+    getData(){
+      if (!this.loading) {
+        this.loading = this.openLoading(
+          document.querySelector(".student_table")
+        );
+      }
+    
+      let params = {
+        cn: this.courseName,
+        uid:this.userid,
+        page: this.page,
+      };
+      this.ajax
+        .get(this.$store.state.api + "getRealTimeClass", params)
+        .then((res) => {
+          this.loading.close();
+          this.loading = "";
+          this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+          this.course = res.data[0];
+        })
+        .catch((err) => {
+          this.loading.close();
+          this.loading = "";
+          console.error(err);
+        });
+    }
   },
   created() {
     this.page = 1;
+    this.getData();
   },
 };
 </script>

+ 98 - 5
src/components/pages/components/answerData.vue

@@ -3,26 +3,47 @@
     <div class="title">
       <span>问答数量</span>
     </div>
-    <div style="width: 100%;height:400px">
+    <div style="width: 100%; height: 400px">
       <!-- <img src="../../assets/dataimage/1.png" style="width:90%" /> -->
-      <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; margin: 0 0 0 1rem"></div>
+      <div
+        id="charts_canvas"
+        class="echart"
+        style="width: 100%; height: 100%; margin: 0 0 0 1rem"
+      ></div>
     </div>
     <div class="tips">
       <img src="../../../assets/tips.png" alt />
       <span>
         提示:目前答对
-        <span>正确选项B</span>的,只有
-        <span>{{problemJson.B}}</span>位同学!学要继续往“实践探究”方向继续加强学习哦!
+        <span>正确选项{{ Aa }}</span
+        >的,有<span>{{ count }}</span
+        >位同学!要继续往“实践探究”方向继续加强学习哦!
       </span>
     </div>
+    <div class="c_box">
+      <div class="correct">
+        <span
+          >答题人数<span>{{ people.length + "人" }}</span></span
+        >
+      </div>
+      <div class="correct">
+        <span
+          >正确率为<span>{{
+            people.length > 0 ? Math.round(count / people.length * 10000) / 10000 * 100 + "%" : 0
+          }}</span></span
+        >
+      </div>
+    </div>
   </div>
 </template>
 
 <script>
 export default {
-  props: ["problemJson"],
+  props: ["problemJson", "answer", "people"],
   data() {
     return {
+      Aa: "",
+      count: 0,
       chartObj: null,
       ooption: {
         xdata: ["A", "B", "C", "D"],
@@ -94,6 +115,32 @@ export default {
   },
   watch: {
     problemJson(val) {
+      this.Aa = "";
+      if (this.answer.indexOf(1) != -1) {
+        this.Aa += "A";
+      }
+      if (this.answer.indexOf(2) != -1) {
+        this.Aa += "B";
+      }
+      if (this.answer.indexOf(3) != -1) {
+        this.Aa += "C";
+      }
+      if (this.answer.indexOf(4) != -1) {
+        this.Aa += "D";
+      }
+
+      if (this.people.length) {
+        this.count = 0;
+        for (var i = 0; i < this.people.length; i++) {
+          var a = JSON.parse(this.people[i].upload);
+          if (a.join(",") == this.answer.join(",")) {
+            this.count++;
+          }
+        }
+      } else {
+        this.count = 0;
+      }
+
       this.ooption = {
         xdata: ["A", "B", "C", "D"],
         sdata: [],
@@ -114,6 +161,31 @@ export default {
     },
   },
   mounted() {
+    this.Aa = "";
+    if (this.answer.indexOf(1) != -1) {
+      this.Aa += "A";
+    }
+    if (this.answer.indexOf(2) != -1) {
+      this.Aa += "B";
+    }
+    if (this.answer.indexOf(3) != -1) {
+      this.Aa += "C";
+    }
+    if (this.answer.indexOf(4) != -1) {
+      this.Aa += "D";
+    }
+    if (this.people.length) {
+      this.count = 0;
+      for (var i = 0; i < this.people.length; i++) {
+        var a = JSON.parse(this.people[i].upload);
+        if (a.join(",") == this.answer.join(",")) {
+          this.count++;
+        }
+      }
+    } else {
+      this.count = 0;
+    }
+
     this.ooption.sdata[0] = this.problemJson.A;
     this.ooption.sdata[1] = this.problemJson.B;
     this.ooption.sdata[2] = this.problemJson.C;
@@ -167,4 +239,25 @@ export default {
   color: #077aff;
   margin: 0 3px;
 }
+.c_box {
+  margin-top: 10px;
+  display: flex;
+}
+.correct + .correct {
+  margin-left: 10px;
+}
+.correct {
+  display: flex;
+  align-items: flex-start;
+  width: fit-content;
+  background: #eee;
+  padding: 6px 6px;
+  box-sizing: border-box;
+  border-radius: 5px;
+  color: #171717;
+}
+.correct span span {
+  color: #077aff;
+  margin: 0 3px;
+}
 </style>

+ 222 - 0
src/components/pages/components/answerData2.vue

@@ -0,0 +1,222 @@
+<template>
+  <div class="data_body">
+    <div class="title">
+      <span>答对数量</span>
+    </div>
+    <div style="width: 100%; height: 400px">
+      <!-- <img src="../../assets/dataimage/1.png" style="width:90%" /> -->
+      <div
+        id="charts_canvas"
+        class="echart"
+        style="width: 100%; height: 100%; margin: 0 0 0 1rem"
+      ></div>
+    </div>
+    <div class="c_box">
+      <div class="correct">
+        <span
+          >答题人数<span>{{ people.length + "人" }}</span></span
+        >
+      </div>
+      <div class="correct">
+        <span
+          >全部答对人数为<span>{{
+            count+'人'
+          }}</span></span
+        >
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: ["problemJson", "answer", "people"],
+  data() {
+    return {
+      Aa: "",
+      count: 0,
+      chartObj: null,
+      ooption: {
+        xdata: [],
+        sdata: [],
+      },
+      option: {
+        tooltip: {
+          trigger: "item",
+          formatter: "第{b0}题: 答对{c0}人",
+        },
+        grid: {
+          left: "1%",
+          bottom: "10%",
+          top: "15%",
+          containLabel: true,
+        },
+        yAxis: {
+          type: "value",
+          boundaryGap: [0, 1],
+          minInterval: 1,
+          axisLine: {
+            onZero: false,
+          },
+        },
+        xAxis: {
+          type: "category",
+          data: [],
+          axisLabel: {
+            textStyle: {
+              color: "#000",
+            },
+          },
+        },
+
+        series: [
+          {
+            type: "bar",
+            data: [],
+            showBackground: true,
+            barWidth: "50px",
+            label: {
+              show: true,
+              position: "top",
+              color: "#2e2e2e",
+            },
+          },
+        ],
+      },
+    };
+  },
+  methods: {
+    setChart(option) {
+      // 雷达图显示的标签
+      let newPromise = new Promise((resolve) => {
+        resolve();
+      });
+      //然后异步执行echarts的初始化函数
+      newPromise.then(() => {
+        const chartObj = this.$echarts.init(
+          //劳动课程
+          this.$el.querySelector("#charts_canvas")
+        );
+        this.option.xAxis.data = option.xdata;
+        this.option.series[0].data = option.sdata;
+        // 初始化雷达图
+        this.chartObj = chartObj;
+        this.chartObj.setOption(this.option);
+      });
+    },
+  },
+  watch: {
+    problemJson(val) {
+      this.ooption = {
+        xdata: [],
+        sdata: [],
+      };
+      for (var i = 0; i < this.problemJson; i++) {
+        this.ooption.xdata.push(i + 1);
+        this.ooption.sdata.push(0);
+      }
+      if (!this.chartObj) {
+        this.setChart(this.ooption);
+      } else {
+        this.option.yAxis.data = this.ooption.xdata;
+        this.option.series[0].data = this.ooption.sdata;
+        this.chartObj.setOption(this.option);
+      }
+      this.$forceUpdate();
+    },
+  },
+  mounted() {
+    this.ooption = {
+      xdata: [],
+      sdata: [],
+    };
+    for (var i = 0; i < this.problemJson; i++) {
+      this.ooption.xdata.push(i + 1);
+      this.ooption.sdata.push(0);
+    }
+    let count = 0;
+    for (var i = 0; i < this.people.length; i++) {
+      let el = JSON.parse(this.people[i].upload);
+      let count2 = 0;
+      for (var j = 0; j < this.problemJson; j++) {
+        if (this.answer[j] == el[j]) {
+          this.ooption.sdata[j]++;
+          count2++;
+        }
+      }
+      if (count2 == this.problemJson) {
+        count++;
+      }
+    }
+    this.count = count;
+    this.setChart(this.ooption);
+    var _this = this;
+    window.addEventListener("resize", () => {
+      if (_this.chartObj) {
+        _this.chartObj.resize();
+      }
+    });
+  },
+};
+</script>
+
+<style scoped>
+.data_body {
+  height: 500px;
+  /* display: flex; */
+  position: relative;
+  border-radius: 5px;
+  /* border: 1px solid #eee; */
+  margin: 10px auto;
+  box-sizing: border-box;
+  padding: 10px;
+  width: 95%;
+  background: #fff;
+}
+.data_body .title {
+  /* position: absolute;
+  top: 20px;
+  left: 20px; */
+}
+
+.tips {
+  display: flex;
+  align-items: flex-start;
+  width: 100%;
+  background: #eee;
+  padding: 6px 6px;
+  box-sizing: border-box;
+  border-radius: 5px;
+  color: #171717;
+}
+
+.tips img {
+  margin-right: 5px;
+}
+
+.tips span span {
+  color: #077aff;
+  margin: 0 3px;
+}
+.c_box {
+  margin-top: 10px;
+  display: flex;
+}
+.correct + .correct {
+  margin-left: 10px;
+}
+.correct {
+  display: flex;
+  align-items: flex-start;
+  width: fit-content;
+  background: #eee;
+  padding: 6px 6px;
+  box-sizing: border-box;
+  border-radius: 5px;
+  color: #171717;
+}
+.correct span span {
+  color: #077aff;
+  margin: 0 3px;
+}
+</style>

+ 4 - 2
src/components/pages/components/imgDraw/imgDraw.vue

@@ -499,8 +499,10 @@ export default {
         var scrollT =
           document.getElementsByClassName("d_body")[0].scrollTop ||
           document.getElementsByClassName("d_body")[0].scrollTop;
-        mx = e.clientX + scrollL;
-        my = e.clientY + scrollT;
+        // mx = e.clientX + scrollL;
+        // my = e.clientY + scrollT;
+        mx = e.clientX  - this.canvas_front.offsetLeft+ scrollL;
+        my = e.clientY - this.canvas_front.offsetTop + scrollT;
         // const cbx = this.ctx_base.getImageData(
         //   e.offsetX - this.slide / 2,
         //   e.offsetY - this.slide / 2,

+ 12 - 1
src/components/pages/components/pdf.vue

@@ -17,7 +17,7 @@
 
     <div class="pdf_footer">
       <div class="info">
-        <div>当前页数/总页数:{{pageNum}}/{{pageTotalNum}}</div>
+        <div>当前页数/总页数:{{ pageNum }}/{{ pageTotalNum }}</div>
         <!-- <div>进度:{{loadedRatio}}</div> -->
         <!-- <div>页面加载成功: {{curPageNum}}</div> -->
       </div>
@@ -75,6 +75,7 @@ export default {
     pageTotalNum(val) {
       if (val) {
         this.loading.close();
+        this.getPage(1);
       }
     },
   },
@@ -103,10 +104,20 @@ export default {
     //   _this.scale = 69;
     //   _this.$refs.pdf.$el.style.width = parseInt(this.scale) + "%";
     // }
+    this.$emit(
+      "getWidth",
+      (document.getElementsByClassName("pdf")[0].offsetHeight - 100) * 1.77 +
+        "px"
+    );
     window.addEventListener("resize", () => {
       this.$refs.pdf.$el.style.width =
         (document.getElementsByClassName("pdf")[0].offsetHeight - 100) * 1.77 +
         "px";
+      this.$emit(
+        "getWidth",
+        (document.getElementsByClassName("pdf")[0].offsetHeight - 100) * 1.77 +
+          "px"
+      );
       //   var a = document.getElementsByClassName("pdf")[0].offsetWidth;
       //   if (a < 1300) {
       //     _this.scale = 100;

+ 244 - 42
src/components/pages/components/worksDetail2.vue

@@ -40,7 +40,11 @@
               :value="item.userid"
             ></el-option>
           </el-select>
-          <el-select v-model="chooseDy" placeholder="请选择阶段" @change="searchWork1">
+          <el-select
+            v-model="chooseDy"
+            placeholder="请选择阶段"
+            @change="searchWork1"
+          >
             <el-option label="所有阶段" value></el-option>
             <el-option
               v-for="(item, index) in dyList"
@@ -49,7 +53,11 @@
               :value="item.id"
             ></el-option>
           </el-select>
-          <el-select v-model="chooseTask" placeholder="请选择任务" @change="searchWork2">
+          <el-select
+            v-model="chooseTask"
+            placeholder="请选择任务"
+            @change="searchWork2"
+          >
             <el-option label="所有任务" value></el-option>
             <el-option
               v-for="(item, index) in dyList[chooseDy]
@@ -77,30 +85,62 @@
           :row-class-name="tableRowClassName"
           stripe
         >
-          <el-table-column prop="sName" label="姓名" min-width="15" align="center"></el-table-column>
-          <el-table-column prop="class" label="班级" min-width="20" align="center">
+          <el-table-column
+            prop="sName"
+            label="姓名"
+            min-width="15"
+            align="center"
+          ></el-table-column>
+          <el-table-column
+            prop="class"
+            label="班级"
+            min-width="20"
+            align="center"
+          >
             <template slot-scope="scope">
               <div>{{ scope.row.class ? scope.row.class : "暂无班级" }}</div>
             </template>
           </el-table-column>
-          <el-table-column prop="course" label="项目" min-width="20" align="center"></el-table-column>
-          <el-table-column prop="course" label="阶段" min-width="20" align="center">
+          <el-table-column
+            prop="course"
+            label="项目"
+            min-width="20"
+            align="center"
+          ></el-table-column>
+          <el-table-column
+            prop="course"
+            label="阶段"
+            min-width="20"
+            align="center"
+          >
             <template slot-scope="scope">
-              <div>{{ dyList.length > 0 ? dyList[scope.row.stage].name : "" }}</div>
+              <div>
+                {{ dyList.length > 0 ? dyList[scope.row.stage].name : "" }}
+              </div>
             </template>
           </el-table-column>
-          <el-table-column prop="course" label="任务" min-width="20" align="center">
+          <el-table-column
+            prop="course"
+            label="任务"
+            min-width="20"
+            align="center"
+          >
             <template slot-scope="scope">
               <div>
                 {{
-                dyList.length > 0
-                ? dyList[scope.row.stage].taskList[scope.row.task].name
-                : ""
+                  dyList.length > 0
+                    ? dyList[scope.row.stage].taskList[scope.row.task].name
+                    : ""
                 }}
               </div>
             </template>
           </el-table-column>
-          <el-table-column prop="time" label="时间" width="200px" align="center"></el-table-column>
+          <el-table-column
+            prop="time"
+            label="时间"
+            width="200px"
+            align="center"
+          ></el-table-column>
           <el-table-column label="操作" width="200px">
             <template slot-scope="scope">
               <el-button
@@ -114,7 +154,8 @@
                     scope.row.task
                   )
                 "
-              >查看作业</el-button>
+                >查看作业</el-button
+              >
               <!-- <el-button
                 type="primary"
                 size="small"
@@ -132,7 +173,8 @@
                     scope.row.task
                   )
                 "
-              >导出报告</el-button>
+                >导出报告</el-button
+              >
               <!-- <el-button
                 class="de_button"
                 type="primary"
@@ -147,7 +189,7 @@
           :visible.sync="dialogVisible3"
           :append-to-body="true"
           :before-close="handleClose"
-          width="1000px"
+          width="1200px"
           class="dialog_diy2"
         >
           <div class="zyBoxC">
@@ -155,17 +197,20 @@
               <div class="course_t">
                 <span>
                   {{
-                  "第" + (sInfo.stage + 1) + "阶段 " + dyList[sInfo.stage].name
+                    "第" +
+                    (sInfo.stage + 1) +
+                    "阶段 " +
+                    dyList[sInfo.stage].name
                   }}
                 </span>
                 <!-- <span>{{ "任务"+(sInfo.task + 1)+' ' + dyList[sInfo.stage].taskList[sInfo.task].name }}</span> -->
               </div>
               <span>
                 {{
-                "任务" +
-                (sInfo.task + 1) +
-                " " +
-                dyList[sInfo.stage].taskList[sInfo.task].name
+                  "任务" +
+                  (sInfo.task + 1) +
+                  " " +
+                  dyList[sInfo.stage].taskList[sInfo.task].name
                 }}-{{ sInfo.sName }}
               </span>
               <!-- <span v-if="item.askJson" @click="checkAsk(item.askJson)">查看问卷</span> -->
@@ -173,16 +218,26 @@
             <div class="zyBox">
               <div class="left">
                 <div class="left_top">
-                  <div class="bigImg" v-if="worksDetail.img && worksDetail.img.length">
+                  <div
+                    class="bigImg"
+                    v-if="worksDetail.img && worksDetail.img.length"
+                  >
                     <img :src="worksDetail.img[worksDetail.imgIndex].src" alt />
                   </div>
-                  <div class="thumbnail" v-if="worksDetail.img && worksDetail.img.length">
+                  <div
+                    class="thumbnail"
+                    v-if="worksDetail.img && worksDetail.img.length"
+                  >
                     <div
                       v-for="(item, index) in worksDetail.img"
                       :key="index"
                       :class="worksDetail.imgIndex == index ? 'isClick' : ''"
                     >
-                      <img :src="item.src" alt @click="worksDetail.imgIndex = index" />
+                      <img
+                        :src="item.src"
+                        alt
+                        @click="worksDetail.imgIndex = index"
+                      />
                     </div>
                   </div>
                   <div class="work_nopicture" v-else>暂无上传截图</div>
@@ -194,9 +249,17 @@
                   >{{ "任务"+(sInfo.task + 1)+' ' + dyList[sInfo.stage].taskList[sInfo.task].name }}</div>-->
                   <div class="ask_Answer" v-if="worksDetail.askInfo">
                     <div class="ask_Answer_title">问卷调查</div>
-                    <div class="ask_Answer_content" v-if="!worksDetail.askInfo.length">暂无提交问卷</div>
+                    <div
+                      class="ask_Answer_content"
+                      v-if="!worksDetail.askInfo.length"
+                    >
+                      暂无提交问卷
+                    </div>
                     <div class="ask_body" v-else>
-                      <div v-for="(item, index) in worksDetail.askInfo" :key="index">
+                      <div
+                        v-for="(item, index) in worksDetail.askInfo"
+                        :key="index"
+                      >
                         <span>
                           问卷-
                           {{ item.askTitle }}
@@ -210,9 +273,21 @@
                   </div>
                 </div>
               </div>
-              <div style="width: 310px; margin-right: 10px">
-                <div class="sd_score" style="box-sizing: border-box; width: 100%; box-shadow: none">
-                  <div class="score_box" v-for="(item, index) in worksDetail.eList" :key="index">
+              <div style="width: 610px; margin-right: 10px">
+                <div
+                  class="sd_score"
+                  style="box-sizing: border-box; width: 100%; box-shadow: none"
+                >
+                  <div class="title" style="margin-bottom: 10px">
+                    <span style="font-size: 18px; width: unset; display: unset"
+                      >量规评分</span
+                    >
+                  </div>
+                  <div
+                    class="score_box"
+                    v-for="(item, index) in worksDetail.eList"
+                    :key="index"
+                  >
                     <el-tooltip
                       class="item"
                       effect="dark"
@@ -221,7 +296,11 @@
                     >
                       <span>{{ item.value }}</span>
                     </el-tooltip>
-                    <el-rate style="min-width: 120px" v-model="worksDetail.rateList[item.value]"></el-rate>
+                    <el-rate
+                      class="rate_size"
+                      style="min-width: 120px"
+                      v-model="worksDetail.rateList[item.value]"
+                    ></el-rate>
                   </div>
                   <!-- <div class="score_box">
                     <span>意识能力</span>
@@ -246,7 +325,7 @@
                 </div>
                 <div class="data_body">
                   <div class="title">
-                    <span style="font-size: 18px">量规评分</span>
+                    <span style="font-size: 18px">雷达图</span>
                   </div>
                   <div style="width: 100%">
                     <!-- <img src="../../../assets/dataimage/1.png" style="width:90%" /> -->
@@ -260,7 +339,12 @@
               <div class="right">
                 <div class="comment" v-if="worksDetail.answerInfo">
                   <div class="comment_title">问答</div>
-                  <div class="other_Answer" v-if="!worksDetail.answerInfo.length">暂无提交问答</div>
+                  <div
+                    class="other_Answer"
+                    v-if="!worksDetail.answerInfo.length"
+                  >
+                    暂无提交问答
+                  </div>
                   <div class="comment_body" v-else>
                     <div
                       class="answer_body"
@@ -360,7 +444,11 @@
         </div>
         <div class="a_addBox">
           <div style="font-size: 16px; color: #c7c7c7">问卷内容</div>
-          <div class="a_add_box" v-for="(item, index) in askJson.askJson" :key="index">
+          <div
+            class="a_add_box"
+            v-for="(item, index) in askJson.askJson"
+            :key="index"
+          >
             <div class="a_add_head">
               <div style="display: flex">
                 {{ index + 1 + "、" }}
@@ -376,7 +464,8 @@
                     :label="checkIndex1"
                     class="redioStyle"
                     disabled
-                  >{{ item3 }}</el-radio>
+                    >{{ item3 }}</el-radio
+                  >
                 </el-radio-group>
               </div>
             </div>
@@ -384,7 +473,9 @@
         </div>
       </div>
       <span slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="dialogVisible4 = false">关 闭</el-button>
+        <el-button type="primary" @click="dialogVisible4 = false"
+          >关 闭</el-button
+        >
       </span>
     </el-dialog>
   </div>
@@ -530,6 +621,86 @@ export default {
           },
         ],
       },
+      // 雷达图的数据
+      radarOption: {
+        splitNumber: 5,
+        tooltip: {
+          triggerOn: "mousemove",
+          //雷达图的tooltip不会超出div,也可以设置position属性,position定位的tooltip 不会随着鼠标移动而位置变化,不友好
+          confine: true,
+          enterable: true, //鼠标是否可以移动到tooltip区域内
+          backgroundColor: "rgba(255,255,255,0.7)",
+          textStyle: {
+            // 文字样式
+            align: "left",
+          },
+          left: "right",
+          top: "bottom",
+        },
+        radar: {
+          radius: ["0%", "70%"],
+          shape: "circle",
+          center: ["50%", "50%"],
+          axisName: {
+            textStyle: {
+              // 文字样式
+              color: "#58a5e6",
+            },
+            formatter: function (value, indicator) {
+              // value = value.replace(/\S{2}/g, function (match) {
+              //   return match + "\n";
+              // });
+              return value;
+            },
+          },
+          indicator: [
+            // 雷达图的指示器,用来指定雷达图中的多个变量(维度)
+          ],
+        },
+        // 雷达图背景的颜色,在这儿随便设置了一个颜色,完全不透明度为0,就实现了透明背景
+        splitArea: {
+          show: true,
+          areaStyle: {
+            color: "rgba(255,0,0,0)", // 图表背景的颜色
+          },
+        },
+        splitLine: {
+          show: true,
+          lineStyle: {
+            width: 1,
+            color: "rgba(131,141,158,.1)", // 设置网格的颜色
+          },
+        },
+        series: [
+          {
+            name: "能力图", // tooltip中的标题
+            type: "radar", // 表示是雷达图
+            symbol: "circle", // 拐点的样式,还可以取值'rect','angle'等
+            symbolSize: 8, // 拐点的大小
+            areaStyle: {
+              normal: {
+                width: 1,
+                opacity: 0.2,
+              },
+            },
+            data: [
+              {
+                // 设置各个指标原始值
+                value: [],
+                // 设置区域边框和区域的颜色
+                itemStyle: {
+                  normal: {
+                    color: "#58a5e6",
+                    lineStyle: {
+                      color: "#58a5e6",
+                    },
+                  },
+                },
+              },
+            ],
+          },
+        ],
+      },
       askJson: {},
       dyList: [],
       userAarray: [],
@@ -703,12 +874,21 @@ export default {
 
           setTimeout(() => {
             var _ooption = JSON.parse(JSON.stringify(this.ooption));
-            var _option = JSON.parse(JSON.stringify(this.option));
+            // var _option = JSON.parse(JSON.stringify(this.option));
+            // var _option = JSON.parse(JSON.stringify(this.radarOption));
+            var _option = this.radarOption;
+            _option.radar.indicator = [];
+            _option.series[0].data[0].value = [];
+            for (var i = 0; i < _ooption.length; i++) {
+              _option.radar.indicator.push({ name: _ooption[i].name, max: 5 });
+              _option.series[0].data[0].value.push(_ooption[i].value);
+            }
+            console.log(_option);
             if (this.chartObj) {
-              _option.series[0].data = _ooption;
+              // _option.series[0].data = _ooption;
               this.chartObj.setOption(_option);
             } else {
-              _option.series[0].data = _ooption;
+              // _option.series[0].data = _ooption;
               this.setChart(_option);
             }
             // this.setChart(this.option);
@@ -882,7 +1062,7 @@ export default {
             type: "success",
           });
           var _ooption = JSON.parse(JSON.stringify(this.ooption));
-          var _option = JSON.parse(JSON.stringify(this.option));
+          // var _option = JSON.parse(JSON.stringify(this.option));
 
           var _rate = this.worksDetail.rateList;
           var _rateList = Object.keys(this.worksDetail.rateList);
@@ -892,8 +1072,17 @@ export default {
             }
           }
 
+          // var _option = JSON.parse(JSON.stringify(this.radarOption));
+          var _option = this.radarOption;
+          _option.radar.indicator = [];
+          _option.series[0].data[0].value = [];
+          for (var i = 0; i < _ooption.length; i++) {
+            _option.radar.indicator.push({ name: _ooption[i].name, max: 5 });
+            _option.series[0].data[0].value.push(_ooption[i].value);
+          }
+          console.log(_option);
           if (this.chartObj) {
-            _option.series[0].data = _ooption;
+            // _option.series[0].data = _ooption;
             this.chartObj.setOption(_option);
           } else {
             this.setChart(_ooption);
@@ -1451,16 +1640,28 @@ export default {
   border-radius: 5px;
   width: 90%;
   box-shadow: 2px 2px 5px #909090;
-  height: 220px;
+  height: 238px;
   overflow: auto;
 }
 .sd_score .score_box {
   display: flex;
   align-items: center;
-  margin-bottom: 18px;
+  justify-content: center;
+  margin-bottom: 15px;
+  /* margin-left: 30px; */
+}
+.sd_score .score_box:last-child {
+  margin-bottom: 0;
+}
+
+.rate_size >>> .el-rate__icon {
+    font-size: 25px;
+}
+.rate_size >>> .el-icon-star-off{
+  font-size: 22px;
 }
 .sd_score span {
-  width: 100px;
+  width: 130px;
   text-align: justify;
   text-align-last: justify;
   display: block;
@@ -1468,6 +1669,7 @@ export default {
   white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
+  font-size: 16px;
 }
 .moreSay {
   margin: 0px 0 5px 20px;

+ 26 - 48
src/components/pages/course.vue

@@ -3,15 +3,12 @@
     <div class="pb_head top">
       <span>项目管理</span>
       <div class="student_button">
-        <el-button type="primary" class="bgColor" @click="openCourse"
-          >协同编辑</el-button
-        >
+        <el-button type="primary" class="bgColor" @click="openCourse">协同编辑</el-button>
         <el-button
           type="primary"
           class="bgColor"
           @click="goTo('/course/addCourse?userid=' + userid + '&oid=' + oid)"
-          >添加项目</el-button
-        >
+        >添加项目</el-button>
       </div>
     </div>
     <div class="pb_content_body" style="height: 100%">
@@ -24,17 +21,9 @@
               <el-option value="1" label="他人课程"></el-option>
             </el-select>
           </div>
-          <div
-            class="all_choose"
-            v-for="(item, index) in CourseType[0]"
-            :key="index"
-          >
+          <div class="all_choose" v-for="(item, index) in CourseType[0]" :key="index">
             <span>{{ item.name }}</span>
-            <el-select
-              v-model="courseTypeId[item.id]"
-              placeholder="请选择"
-              @change="getTypeName"
-            >
+            <el-select v-model="courseTypeId[item.id]" placeholder="请选择" @change="getTypeName">
               <el-option label="全部" value="1">全部</el-option>
               <el-option
                 v-for="item1 in CourseTypeJson[item.id]"
@@ -49,14 +38,8 @@
 
         <div class="student_right">
           <div class="head_left">
-            <el-input
-              v-model="courseName"
-              class="student_input"
-              placeholder="请输入课程名称"
-            ></el-input>
-            <el-button class="course_button" @click="searchCourse"
-              >查询</el-button
-            >
+            <el-input v-model="courseName" class="student_input" placeholder="请输入课程名称"></el-input>
+            <el-button class="course_button" @click="searchCourse">查询</el-button>
           </div>
         </div>
       </div>
@@ -77,9 +60,7 @@
             </div>
             <div class="bottom_box">
               <div>{{ item.title }}</div>
-              <div class="kc_t" v-if="groupA == '1'">
-                创建老师:{{ item.uname }}
-              </div>
+              <div class="kc_t" v-if="groupA == '1'">创建老师:{{ item.uname }}</div>
               <div class="kc_time">{{ item.time }}</div>
             </div>
             <div class="three_bottom">
@@ -96,9 +77,7 @@
                       oid
                   )
                 "
-              >
-                修改
-              </div>
+              >修改</div>
               <div
                 @click="
                   goTo(
@@ -110,9 +89,7 @@
                       oid
                   )
                 "
-              >
-                报告
-              </div>
+              >报告</div>
               <div @click="deleteCourse(item.courseId)">删除</div>
             </div>
           </div>
@@ -196,12 +173,10 @@
                     oid
                 )
               "
-            >
-              编辑
-            </div>
+            >编辑</div>
           </div>
         </div>
-         <div class="course_empty" v-if="courseTeam.length == 0">暂无数据</div>
+        <div class="course_empty" v-if="courseTeam.length == 0">暂无数据</div>
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="dialogVisibleCourse = false">关 闭</el-button>
@@ -330,14 +305,13 @@ export default {
     },
     //uuid生成
     guid() {
-      return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
-        /[xy]/g,
-        function (c) {
-          var r = (Math.random() * 16) | 0,
-            v = c == "x" ? r : (r & 0x3) | 0x8;
-          return v.toString(16);
-        }
-      );
+      return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (
+        c
+      ) {
+        var r = (Math.random() * 16) | 0,
+          v = c == "x" ? r : (r & 0x3) | 0x8;
+        return v.toString(16);
+      });
     },
     time() {
       if (!this.now) {
@@ -364,10 +338,10 @@ export default {
       this.getCourse();
     },
     getCourse() {
-      if(!this.loading){
+      if (!this.loading) {
         this.loading = this.openLoading(
-        document.querySelector(".student_table")
-      );
+          document.querySelector(".student_table")
+        );
       }
       var typeE = [];
       var typea, typeb, typec, typed;
@@ -409,7 +383,7 @@ export default {
         .get(this.$store.state.api + "selectCourseNew", params)
         .then((res) => {
           this.loading.close();
-          this.loading = '';
+          this.loading = "";
           this.isLoading = false;
           this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
           this.course = res.data[0];
@@ -746,11 +720,15 @@ export default {
   width: 100%;
   height: 141.06px;
   margin: 0 auto;
+  overflow: hidden;
+  display: flex;
+  align-items: center;
 }
 
 .tup > img {
   width: 100%;
   height: 100%;
+  object-fit: contain;
 }
 
 .kc_time {

+ 4 - 0
src/components/pages/evaluation.vue

@@ -350,6 +350,8 @@ export default {
       dialogVisible: false,
       dialogVisible2: false,
       dialogVisible3: false,
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
       eTitle: "",
       eName: "",
       eJson: {},
@@ -543,6 +545,7 @@ export default {
     },
     getData() {
       let params = {
+        oid: this.oid,
         n: this.sn,
         page: this.page,
       };
@@ -741,6 +744,7 @@ export default {
   align-items: center;
   border-radius: 5px;
   margin-top: 10px;
+  text-align: center;
 }
 .e_card_picture {
   margin: 20px 0;

File diff suppressed because it is too large
+ 616 - 102
src/components/pages/liveRoom.vue


+ 3 - 3
src/main.js

@@ -15,12 +15,12 @@ import VueCookies from 'vue-cookies'
 import Viewer from 'v-viewer'
 import 'viewerjs/dist/viewer.css'
 import Clipboard from "clipboard";
-// import hevueImgPreview from 'hevue-img-preview'
+import hevueImgPreview from 'hevue-img-preview'
 
 const echarts = require('echarts');
 
-//.use(hevueImgPreview)
-Vue.use(VideoPlayer).use(VueCookies).use(Viewer)
+//
+Vue.use(VideoPlayer).use(VueCookies).use(Viewer).use(hevueImgPreview)
 Vue.config.productionTip = false
 Vue.prototype.$store = store; // 将store实例挂在vue原型上
 Vue.prototype.ajax = ajax

+ 204 - 196
src/router/index.js

@@ -26,206 +26,214 @@ import GridList from '@/components/pages/GridList'
 import wordList from '@/components/pages/wordList'
 import demoPdf from '@/components/pages/demoPdf'
 import demoPdf2 from '@/components/pages/demoPdf2'
+import audioDemo from '@/components/pages/audioDemo'
 
 Vue.use(Router).use(ElementUI)
 
 export default new Router({
   routes: [{
-      path: '/class',
-      name: 'class',
-      component: classA,
-      meta: {
-        requireAuth: ''
-      }
-    },
-    // {
-    //   path: '/',
-    //   redirect: '/course',
-    // },
-    {
-      path: '/course',
-      component: course,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/course/courseDetail',
-      component: courseDetail,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/course/addCourse',
-      component: addCourse,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/data',
-      name: 'data',
-      component: data,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    }, {
-      path: '/notice',
-      name: 'notice',
-      component: notice,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/student',
-      name: 'student',
-      component: student,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/ask',
-      name: 'ask',
-      component: ask,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/ask/askList',
-      name: 'askList',
-      component: () =>
-        import('@/components/pages/askList'),
-      meta: {}
-    },
-    {
-      path: '/works',
-      name: 'works',
-      component: works,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/worksDetail',
-      name: 'worksDetail',
-      component: worksDetail,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/library',
-      name: 'library',
-      component: library,
-      meta: {
-        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-      }
-    },
-    {
-      path: '/login',
-      name: 'login',
-      component: login,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/note',
-      name: 'note',
-      component: note,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/Grid',
-      name: 'Grid',
-      component: Grid,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/demo',
-      name: 'demo',
-      component: demo,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/classRoom',
-      name: 'classRoom',
-      component: classRoom,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/liveRoom',
-      name: 'liveRoom',
-      component: liveRoom,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/addPPt',
-      name: 'addPPt',
-      component: addPPt,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/studyLibrary',
-      name: 'studyLibrary',
-      component: studyLibrary,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/evaluation',
-      name: 'evaluation',
-      component: evaluation,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/GridList',
-      name: 'GridList',
-      component: GridList,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
-    {
-      path: '/wordList',
-      name: 'wordList',
-      component: wordList,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    }, {
-      path: '/demoPdf',
-      name: 'demoPdf',
-      component: demoPdf,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    }, {
-      path: '/demoPdf2',
-      name: 'demoPdf2',
-      component: demoPdf2,
-      meta: {
-        requireAuth: '' // 不需要鉴权
-      }
-    },
+    path: '/class',
+    name: 'class',
+    component: classA,
+    meta: {
+      requireAuth: ''
+    }
+  },
+  // {
+  //   path: '/',
+  //   redirect: '/course',
+  // },
+  {
+    path: '/course',
+    component: course,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/course/courseDetail',
+    component: courseDetail,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/course/addCourse',
+    component: addCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/data',
+    name: 'data',
+    component: data,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  }, {
+    path: '/notice',
+    name: 'notice',
+    component: notice,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/student',
+    name: 'student',
+    component: student,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/ask',
+    name: 'ask',
+    component: ask,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/ask/askList',
+    name: 'askList',
+    component: () =>
+      import('@/components/pages/askList'),
+    meta: {}
+  },
+  {
+    path: '/works',
+    name: 'works',
+    component: works,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/worksDetail',
+    name: 'worksDetail',
+    component: worksDetail,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/library',
+    name: 'library',
+    component: library,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/login',
+    name: 'login',
+    component: login,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/note',
+    name: 'note',
+    component: note,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/Grid',
+    name: 'Grid',
+    component: Grid,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/demo',
+    name: 'demo',
+    component: demo,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/classRoom',
+    name: 'classRoom',
+    component: classRoom,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/liveRoom',
+    name: 'liveRoom',
+    component: liveRoom,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/addPPt',
+    name: 'addPPt',
+    component: addPPt,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/studyLibrary',
+    name: 'studyLibrary',
+    component: studyLibrary,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/evaluation',
+    name: 'evaluation',
+    component: evaluation,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/GridList',
+    name: 'GridList',
+    component: GridList,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/wordList',
+    name: 'wordList',
+    component: wordList,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/demoPdf',
+    name: 'demoPdf',
+    component: demoPdf,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/demoPdf2',
+    name: 'demoPdf2',
+    component: demoPdf2,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/audioDemo',
+    name: 'audioDemo',
+    component: audioDemo,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
   ]
 })

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