Pārlūkot izejas kodu

Merge branch 'master' of http://60.205.254.193:3000/GCLS/GCLS_Page_Textbook

dusenyao 1 gadu atpakaļ
vecāks
revīzija
0645ed3ce7

+ 0 - 79
package-lock.json

@@ -29,7 +29,6 @@
         "@electron-forge/maker-squirrel": "^7.3.1",
         "@electron-forge/maker-zip": "^7.3.1",
         "@electron-forge/plugin-auto-unpack-natives": "^7.3.1",
-        "@electron/fuses": "^1.8.0",
         "@rushstack/eslint-patch": "^1.10.1",
         "@types/md5": "^2.3.5",
         "@vue/cli-plugin-babel": "~5.0.8",
@@ -2937,84 +2936,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/@electron/fuses": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmmirror.com/@electron/fuses/-/fuses-1.8.0.tgz",
-      "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.1.1",
-        "fs-extra": "^9.0.1",
-        "minimist": "^1.2.5"
-      },
-      "bin": {
-        "electron-fuses": "dist/bin.js"
-      }
-    },
-    "node_modules/@electron/fuses/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@electron/fuses/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@electron/fuses/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/@electron/fuses/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/@electron/fuses/node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@electron/fuses/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/@electron/get": {
       "version": "2.0.3",
       "resolved": "https://registry.npmmirror.com/@electron/get/-/get-2.0.3.tgz",

+ 7 - 8
package.json

@@ -30,31 +30,30 @@
   "devDependencies": {
     "@babel/core": "^7.24.3",
     "@babel/eslint-parser": "^7.24.1",
+    "@types/md5": "^2.3.5",
+    "@rushstack/eslint-patch": "^1.10.1",
+    "@vue/eslint-config-prettier": "^9.0.0",
+    "@vue/preload-webpack-plugin": "^2.0.0",
     "@electron-forge/cli": "^7.3.1",
     "@electron-forge/maker-deb": "^7.3.1",
     "@electron-forge/maker-rpm": "^7.3.1",
     "@electron-forge/maker-squirrel": "^7.3.1",
     "@electron-forge/maker-zip": "^7.3.1",
     "@electron-forge/plugin-auto-unpack-natives": "^7.3.1",
-    "@electron/fuses": "^1.8.0",
-    "@rushstack/eslint-patch": "^1.10.1",
-    "@types/md5": "^2.3.5",
     "@vue/cli-plugin-babel": "~5.0.8",
     "@vue/cli-plugin-eslint": "~5.0.8",
     "@vue/cli-service": "~5.0.8",
-    "@vue/eslint-config-prettier": "^9.0.0",
-    "@vue/preload-webpack-plugin": "^2.0.0",
     "compression-webpack-plugin": "^6.1.2",
     "electron": "^29.1.6",
     "eslint": "^8.57.0",
     "eslint-plugin-prettier": "^5.1.3",
     "eslint-plugin-vue": "^9.24.0",
-    "nodemon": "^3.1.0",
-    "patch-package": "^8.0.0",
-    "postcss-html": "^1.6.0",
     "prettier": "^3.2.5",
+    "nodemon": "^3.1.0",
     "sass": "^1.72.0",
     "sass-loader": "^14.1.1",
+    "patch-package": "^8.0.0",
+    "postcss-html": "^1.6.0",
     "stylelint": "^15.11.0",
     "stylelint-config-recess-order": "^4.6.0",
     "stylelint-config-recommended-scss": "^14.0.0",

+ 2 - 4
src/views/book/courseware/create/components/base/audio/Audio.vue

@@ -34,10 +34,8 @@ export default {
     };
   },
   methods: {
-    saveDate(file) {
-      this.data.id = this.id;
-      this.data.file_list.push(file);
-      this.data.file_id_list.push(file.file_id);
+    saveDate(content) {
+      if (content) this.data = content;
     },
   },
 };

+ 50 - 43
src/views/book/courseware/create/components/base/common/UploadFile.vue

@@ -21,18 +21,23 @@
     <el-divider />
     <div class="upload-tip">{{ uploadTip }}</div>
     <ul slot="file-list" class="file-list">
-      <li v-for="(file, i) in file_list" :key="i">
+      <li v-for="(file, i) in content.file_list" :key="i">
         <div class="file-name">
           <span>
             <SvgIcon :icon-class="iconClass" size="12" />
             <span>{{ file.file_name ?? file.name }}</span>
             <!-- <span>({{ file.size }})</span> -->
           </span>
-          <span v-show="file.progress > 0"> {{ file.progress }}% </span>
-          <span v-show="file.file_id"> 完成 </span>
+          <span v-if="file.progress > 0 && file.progress < 100"> {{ file.progress }}% </span>
+          <span v-else-if="file.progress === 100 || file.file_id"> 完成 </span>
         </div>
         <SvgIcon icon-class="delete-black" size="12" @click="removeFile(file, i)" />
-        <SvgIcon v-show="moduleData.type == 'picture'" icon-class="mark" size="12" @click="viewDialog(file)" />
+        <SvgIcon
+          v-show="content.type === 'picture' && (file.progress === 100 || file.file_id)"
+          icon-class="mark"
+          size="12"
+          @click="viewDialog(file.file_id)"
+        />
       </li>
     </ul>
 
@@ -44,7 +49,6 @@
 import { fileUpload } from '@/api/app';
 import { conversionSize } from '@/utils/common';
 import FillDescribe from '../../common/FillDescribe';
-import { GetCoursewareComponentContent_View } from '@/api/book';
 
 export default {
   name: 'UploadFile',
@@ -91,35 +95,29 @@ export default {
     return {
       curFile: null,
       conversionSize,
-      file_id_list: [],
-      file_list: [],
       visible: false,
+      content: {},
     };
   },
   computed: {},
-  watch: {},
-  created() {
-    this.getCoursewareComponentContent_View();
+  watch: {
+    moduleData: {
+      handler(val) {
+        this.content = val;
+        this.$emit('saveDate', this.content);
+      },
+      immediate: true,
+      deep: true,
+    },
   },
   methods: {
-    // 获取数据
-    getCoursewareComponentContent_View() {
-      GetCoursewareComponentContent_View({ courseware_id: this.coursewareId, component_id: this.componentId }).then(
-        ({ content }) => {
-          if (content) this.file_list = JSON.parse(content).file_list;
-        },
-      );
-    },
-
     // 显示自定义样式文件列表
     onFileChange(file, fileList) {
       this.afterSelectFile(file);
       fileList.forEach((file) => {
         if (!file.progress || file.progress <= 0) file.progress = 0;
-        if (!file.title) file.title = '';
-        if (!file.describe) file.describe = '';
       });
-      this.file_list.push(file);
+      this.content.file_list.push(file);
     },
 
     // 删除文件
@@ -131,10 +129,8 @@ export default {
       })
         .then(() => {
           this.$refs.upload.handleRemove(file);
-          if (this.file_list[i].file_id) {
-            this.file_list.splice(i, 1);
-            this.file_id_list.splice(i, 1);
-          }
+          this.content.file_list.splice(i, 1);
+          this.content.file_id_list.splice(i, 1);
         })
         .catch(() => {});
     },
@@ -142,9 +138,8 @@ export default {
     // 文件校验
     afterSelectFile(file) {
       const fileName = file.name;
-      let singleSizeTip = `文件[${fileName}]大小超过 ${conversionSize(this.moduleData.single_size)},被移除!`;
-
-      if (file.size > this.moduleData.single_size * 1024 * 1024) {
+      let singleSizeTip = `文件[${fileName}]大小超过 ${conversionSize(this.content.single_size)},被移除!`;
+      if (file.size > this.content.single_size * 1024 * 1024) {
         this.$message.error(singleSizeTip);
         this.$refs.upload.handleRemove(file);
         return false;
@@ -154,10 +149,10 @@ export default {
       let fileType = [];
       let typeTip = '';
 
-      if (this.moduleData.type === 'audio') {
+      if (this.content.type === 'audio') {
         fileType = ['mp3', 'acc', 'wma'];
         typeTip = '音频文件只能是 mp3、acc、wma 格式!';
-      } else if (this.moduleData.type === 'picture') {
+      } else if (this.content.type === 'picture') {
         fileType = ['jpg', 'png', 'jpeg'];
         typeTip = '图片文件只能是 jpg、png、jpeg 格式!';
       }
@@ -172,14 +167,14 @@ export default {
 
     // 上传文件
     uploadFiles() {
-      const files = (this.file_list || []).filter((file) => file.uid);
+      const files = (this.content.file_list || []).filter((file) => file.uid);
       if (files.length <= 0) {
         this.$message.error('没有需要上传的文件!');
         return false;
       }
       const totalSize = files.reduce((sum, cur) => sum + Number(cur.size || 0), 0);
-      if (totalSize > this.moduleData.total_size * 1024 * 1024) {
-        this.$message.error(`文件总大小不能超过${conversionSize(this.moduleData.total_size)}!`);
+      if (totalSize > this.content.total_size * 1024 * 1024) {
+        this.$message.error(`文件总大小不能超过${conversionSize(this.content.total_size)}!`);
         return false;
       }
 
@@ -189,32 +184,44 @@ export default {
         fileUpload('Mid', form, {
           handleUploadProgress: (progressEvent) => {
             let per = Number((progressEvent.progress * 100).toFixed(2) || 0);
-            let en = this.file_list.find((p) => p.uid === file.uid);
+            let en = this.content.file_list.find((p) => p.uid === file.uid);
             if (en) {
               en.progress = per;
               this.$forceUpdate();
             }
           },
         }).then(({ file_info_list }) => {
-          let file_index = this.file_list.findIndex((p) => p.uid === file.uid);
+          let file_index = this.content.file_list.findIndex((p) => p.uid === file.uid);
           if (file_index > -1) {
-            this.file_list[file_index] = file_info_list[0];
-            this.file_id_list.push(file_info_list[0].file_id);
-            this.$emit('saveDate', file_info_list[0]);
+            if (this.content.type === 'picture') {
+              this.content.file_info_list[file_index] = {
+                file_id: file_info_list[0].file_id,
+                file_name: file_info_list[0].file_name,
+                title: '',
+                intro: '',
+              };
+            }
+            this.content.file_list[file_index] = {
+              file_id: file_info_list[0].file_id,
+              file_name: file_info_list[0].file_name,
+              file_url: file_info_list[0].file_url,
+            };
+            this.content.file_id_list.push(file_info_list[0].file_id);
           }
         });
       });
     },
 
     // 显示弹窗
-    viewDialog(file) {
-      this.visible = true;
-      this.curFile = file;
+    viewDialog(file_id) {
+      if (file_id) this.visible = true;
+      this.curFile = this.content.file_info_list.find((file) => file.file_id === file_id);
     },
 
     // 给文件加介绍
     fillDescribeToFile(file) {
-      let en = this.file_list.find((p) => p.uid === file.uid);
+      console.log(file);
+      let en = this.content.file_info_list.find((p) => p.file_id === file.file_id);
       if (en) {
         Object.assign(en, file);
       }

+ 2 - 4
src/views/book/courseware/create/components/base/picture/Picture.vue

@@ -35,10 +35,8 @@ export default {
   },
   computed: {},
   methods: {
-    saveDate(file) {
-      this.data.id = this.id;
-      this.data.file_list.push(file);
-      this.data.file_id_list.push(file.file_id);
+    saveDate(content) {
+      if (content) this.data = content;
     },
   },
 };

+ 7 - 9
src/views/book/courseware/create/components/common/FillDescribe.vue

@@ -1,7 +1,7 @@
 <template>
   <el-dialog :visible="visible" width="260px" top="38vh" :show-close="false" @close="dialogClose">
-    <el-input v-model="form.file_title" autocomplete="off" placeholder="标题" />
-    <el-input v-model="form.file_describe" type="textarea" placeholder="介绍" />
+    <el-input v-model="file.title" autocomplete="off" placeholder="标题" />
+    <el-input v-model="file.intro" type="textarea" placeholder="介绍" />
     <template slot="footer">
       <el-button size="medium" @click="dialogClose">取消</el-button>
       <el-button type="primary" size="medium" @click="confirm">确定</el-button>
@@ -24,29 +24,27 @@ export default {
   },
   data() {
     return {
-      form: {
-        uid: '',
-        file_title: '',
-        file_describe: '',
+      file: {
+        title: '',
+        intro: '',
       },
     };
   },
   watch: {
     fileData: {
       handler(val) {
-        Object.assign(this.form, val);
+        Object.assign(this.file, val);
       },
       deep: true,
     },
   },
   methods: {
     dialogClose() {
-      Object.assign(this.form, this.fileData);
       this.$emit('update:visible', false);
     },
     confirm() {
       this.$emit('update:visible', false);
-      this.$emit('fillDescribeToFile', this.form);
+      this.$emit('fillDescribeToFile', this.file);
     },
   },
 };

+ 6 - 1
src/views/book/courseware/create/components/common/ModuleMixin.js

@@ -39,7 +39,12 @@ const mixin = {
   inject: ['courseware_id'],
   created() {
     GetCoursewareComponentContent({ courseware_id: this.courseware_id, component_id: this.id }).then(({ content }) => {
-      if (content) this.data = JSON.parse(content);
+      if (content) {
+        this.$nextTick(() => {
+          // 数据加载完成后的操作
+          this.data = JSON.parse(content);
+        });
+      }
     });
   },
   methods: {

+ 1 - 0
src/views/book/courseware/data/audio.js

@@ -14,6 +14,7 @@ export function getAudioData() {
       sn_generation_method: snGenerationMethodList[0].value, // 序号生成方式:recalculate重新计算 follow 跟随
       view_method: audioViewMethodList[0].value, // 查看方式:independent独立 list列表 icon图标
     },
+    file_info_list: [],
     file_id_list: [], // 文件 id['20032-121212', '20032-121216']
     // 内容中包含的文件列表,
     file_list: [],

+ 1 - 0
src/views/book/courseware/data/picture.js

@@ -14,6 +14,7 @@ export function getPictureData() {
       sn_generation_method: snGenerationMethodList[0].value, // 序号生成方式:recalculate重新计算 follow跟随
       view_method: viewMethodList[0].value, // 查看方式:independent独立 list列表 icon图标
     },
+    file_info_list: [],
     file_id_list: [], // 文件 id['20032-121212', '20032-121216']
     // 内容中包含的文件列表,
     file_list: [],