提交 1d99e640 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 a9ec1dc6
......@@ -10,34 +10,36 @@
"dependencies": {
"@element-plus/icons-vue": "^2.0.6",
"@tinymce/tinymce-vue": "^5.0.0",
"@vueuse/core": "^8.9.3",
"@vueuse/core": "^8.9.4",
"axios": "^0.27.2",
"blueimp-md5": "^2.19.0",
"element-plus": "^2.2.9",
"element-plus": "^2.2.10",
"file-saver": "^2.0.5",
"pinia": "^2.0.16",
"qs": "^6.11.0",
"video.js": "^7.19.2",
"video.js": "^7.20.1",
"vue": "^3.2.37",
"vue-router": "^4.1.2"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.1.0",
"@types/blueimp-md5": "^2.18.0",
"@types/file-saver": "^2.0.5",
"@types/node": "^16.11.43",
"@types/qs": "^6.9.7",
"@types/video.js": "^7.3.42",
"@vitejs/plugin-vue": "^3.0.0",
"@vitejs/plugin-vue": "^3.0.1",
"@vue/eslint-config-typescript": "^11.0.0",
"@vue/tsconfig": "^0.1.3",
"ali-oss": "^6.17.1",
"eslint": "^8.5.0",
"eslint-plugin-vue": "^9.2.0",
"npm-run-all": "^4.1.5",
"sass": "^1.53.0",
"sass": "^1.54.0",
"typescript": "~4.7.4",
"unplugin-auto-import": "^0.9.3",
"unplugin-auto-import": "^0.10.1",
"vite": "^3.0.2",
"vue-tsc": "^0.38.5"
"vue-tsc": "^0.39.0"
}
},
"node_modules/@antfu/utils": {
......@@ -230,6 +232,12 @@
"integrity": "sha512-f4A+++lGZGJvVSgeyMkqA7BEf2BVQli6F+qEykKb49c5ieWQBkfpn6CP5c1IZr2Yi2Ofl6Fj+v0e1fN18Z8Cnw==",
"dev": true
},
"node_modules/@types/file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==",
"dev": true
},
"node_modules/@types/json-schema": {
"version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
......@@ -503,12 +511,12 @@
}
},
"node_modules/@vitejs/plugin-vue": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.0.0.tgz",
"integrity": "sha512-yWP34ArFh/jAeNUDkkLz/kVRLjf5ppJiq4L36f64Cp6dIrMQeYZGDP9xxdemlXfZR9ylN9JgHUl3GzfqOtgYDg==",
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.0.1.tgz",
"integrity": "sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==",
"dev": true,
"engines": {
"node": ">=14.18.0"
"node": "^14.18.0 || >=16.0.0"
},
"peerDependencies": {
"vite": "^3.0.0",
......@@ -516,46 +524,66 @@
}
},
"node_modules/@volar/code-gen": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.38.5.tgz",
"integrity": "sha512-GRGhPKoNtRwZyn9M0b2buobeMR1Aj9zxZI0osanLG9vB9YCnJov1myxKU8EJV5NobpyspLIv1X6/BEHLZNsKig==",
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.39.0.tgz",
"integrity": "sha512-56ycx16FoeDrjVuQ2RKIRmk3paFuIG4eIZLMpxypGKOlhFxS9/nB2eumln2e1jVlnAWeTcFw5V1/eYpDTazHLA==",
"dev": true,
"dependencies": {
"@volar/source-map": "0.38.5"
"@volar/source-map": "0.39.0"
}
},
"node_modules/@volar/source-map": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.38.5.tgz",
"integrity": "sha512-TyTLkOtAW/7qnl4Gabt4W4vcKPBPCBdaPLKwkMglKcaX70lPH2CIwZcPMJo6PAilbUVXcuX86xfgdncWDKKaZQ==",
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.39.0.tgz",
"integrity": "sha512-sV/eDeOjBwDJxrxwP/ifABvlOUzjpUpCbtbAhoc9hD9SrHlaDGrKtnmXdqgH5DNHIfm5aUpY0xojRvFFOubpuw==",
"dev": true
},
"node_modules/@volar/typescript-faster": {
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/typescript-faster/-/typescript-faster-0.39.0.tgz",
"integrity": "sha512-+NNY456ABrvXD2VsJGsH4BGQTWkSyWcUfdbcREqXD+g2GotW7UtkFMtNgu1ASXBhKl7oRdPuRk5wK9Edw2tW9A==",
"dev": true,
"dependencies": {
"semver": "^7.3.7"
}
},
"node_modules/@volar/vue-code-gen": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.38.5.tgz",
"integrity": "sha512-4t2bX2bCmmlyYwPLqfH3AJXj9Km79uRmCy81recc8LB8ZT2Z9hOFNBAnlGNcCeZAtVWtmHVV7sXJtQAJQxkWeg==",
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.39.0.tgz",
"integrity": "sha512-0KqocSt5o4TtmUngq+8tmWRfifgyE9eDzb4/1Ih7bl52T1RDdOOKkZ9GzP3zBic3N7lJHiOaLdGMXTK+IzAe7g==",
"dev": true,
"dependencies": {
"@volar/code-gen": "0.38.5",
"@volar/source-map": "0.38.5",
"@volar/code-gen": "0.39.0",
"@volar/source-map": "0.39.0",
"@vue/compiler-core": "^3.2.37",
"@vue/compiler-dom": "^3.2.37",
"@vue/shared": "^3.2.37"
}
},
"node_modules/@volar/vue-typescript": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-0.38.5.tgz",
"integrity": "sha512-Gobtg5gxR3bf/l1h300OWCWkvDQnOINgnxkDYiF8qdTBalW6qGsgGmq0uLBBDLaoahrfM7rqNd5QfJwGBgFXZg==",
"node_modules/@volar/vue-language-core": {
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-0.39.0.tgz",
"integrity": "sha512-MnXnrIB7PtggLfKcLtg9I5X1i5FMCoTC+jYtR/j5RZU97boPbFi0lYLysCGPUXdP3w5taIXGPgfT8VnbLEkndQ==",
"dev": true,
"dependencies": {
"@volar/code-gen": "0.38.5",
"@volar/source-map": "0.38.5",
"@volar/vue-code-gen": "0.38.5",
"@volar/code-gen": "0.39.0",
"@volar/source-map": "0.39.0",
"@volar/vue-code-gen": "0.39.0",
"@vue/compiler-sfc": "^3.2.37",
"@vue/reactivity": "^3.2.37"
}
},
"node_modules/@volar/vue-typescript": {
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-0.39.0.tgz",
"integrity": "sha512-RV+oHtkuta/kwskg02Ykp9qvDXpgDNF1EVgeGx42v1b65qMyAd5FgxOZxYYCzVV4DzVa6gH+C5YhuQXo4oEdog==",
"dev": true,
"dependencies": {
"@volar/code-gen": "0.39.0",
"@volar/typescript-faster": "0.39.0",
"@volar/vue-language-core": "0.39.0"
}
},
"node_modules/@vue/compiler-core": {
"version": "3.2.37",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
......@@ -702,13 +730,13 @@
}
},
"node_modules/@vueuse/core": {
"version": "8.9.3",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.3.tgz",
"integrity": "sha512-q2pr3N7FPG7IBBhEXTYOJU+38VwKMLP5IfD33byzBV4Th7f1JHT4qPKvJrvr17knAefPRzNqgt9et+xFqaRlPQ==",
"version": "8.9.4",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.4.tgz",
"integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==",
"dependencies": {
"@types/web-bluetooth": "^0.0.14",
"@vueuse/metadata": "8.9.3",
"@vueuse/shared": "8.9.3",
"@vueuse/metadata": "8.9.4",
"@vueuse/shared": "8.9.4",
"vue-demi": "*"
},
"funding": {
......@@ -728,9 +756,9 @@
}
},
"node_modules/@vueuse/core/node_modules/@vueuse/shared": {
"version": "8.9.3",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.3.tgz",
"integrity": "sha512-foorYQAU3CGknAO1w9No/rpGBJmb7L74MPltnZAYxeBRfhsajjJYYgja+D5IT2vT+/a0NciISaVp3fDwMN1ocA==",
"version": "8.9.4",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.4.tgz",
"integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==",
"dependencies": {
"vue-demi": "*"
},
......@@ -751,9 +779,9 @@
}
},
"node_modules/@vueuse/core/node_modules/vue-demi": {
"version": "0.13.4",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.4.tgz",
"integrity": "sha512-KP4lq9uSz0KZbaqCllRhnxMV3mYRsRWJfdsAhZyt5bV5O1RTpoeDptBRV9NOa/JgOpfaA9ane88VF7OjWNK/DA==",
"version": "0.13.5",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.5.tgz",
"integrity": "sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==",
"hasInstallScript": true,
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
......@@ -776,9 +804,9 @@
}
},
"node_modules/@vueuse/metadata": {
"version": "8.9.3",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.3.tgz",
"integrity": "sha512-57gZZKtWAmcJaUBmciCohvmumVLz4+FnoVnWj7U5BWs5PC2/7gU9Z0/i1i9leDNeboAauFzAq7z1GjS8eYnT+w==",
"version": "8.9.4",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.4.tgz",
"integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
......@@ -1434,9 +1462,9 @@
"dev": true
},
"node_modules/element-plus": {
"version": "2.2.9",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.9.tgz",
"integrity": "sha512-jYbL0JkCdv95rkT6trZJjCAizLPySa0qcd2cgq+57SKQnCZAcNDDq4GbTuFRnNavdoeCJnuM3HIficTIUpsMOQ==",
"version": "2.2.10",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.10.tgz",
"integrity": "sha512-hJ+LlbRN3POu4Idl1LXB+SHSWdi+wwmdsoDXdQT2ynGuwzZsMYiusOooYXyEsPlrizeLibdnNGNDx4TIjXQvUg==",
"dependencies": {
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.0.6",
......@@ -2299,6 +2327,11 @@
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"node_modules/file-uri-to-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz",
......@@ -3392,12 +3425,12 @@
}
},
"node_modules/mlly": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-0.5.4.tgz",
"integrity": "sha512-gFlsLWCjVwu/LM/ZfYUkmnbBoz7eyBIMUwVQYDqhd8IvtNFDeZ95uwAyxHE2Xx7tQwePQaCo4fECZ9MWFEUTgQ==",
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-0.5.5.tgz",
"integrity": "sha512-2R4JT/SxRDPexomw4rmHYY/gWAGmL9Kkq1OR76Ua6w+P340a1aBDTWzKo2kAlxzrG82OdXs5VB9Lmcmyit0Obg==",
"dev": true,
"dependencies": {
"pathe": "^0.3.1",
"pathe": "^0.3.2",
"pkg-types": "^0.3.3"
}
},
......@@ -4414,9 +4447,9 @@
"dev": true
},
"node_modules/sass": {
"version": "1.53.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz",
"integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==",
"version": "1.54.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz",
"integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==",
"dev": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
......@@ -4917,9 +4950,9 @@
}
},
"node_modules/unimport": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/unimport/-/unimport-0.4.5.tgz",
"integrity": "sha512-DnmiSt/HQIfhdcxOy4CGqwZDBh3WHg33euX1ge4X8hvquKBmw2PFvhoAJaBKxscOz0oYosoPoPT4tkDZWHhV0Q==",
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/unimport/-/unimport-0.6.3.tgz",
"integrity": "sha512-+DVHqCoOoJcmYRLUrKbKDs/Iq/is6m0K7rTdFJAV7/MfyvWCKeSuSOrLeONgLBd6yC6iZFEzdc8di7S27PQyoA==",
"dev": true,
"dependencies": {
"@rollup/pluginutils": "^4.2.1",
......@@ -4927,7 +4960,7 @@
"fast-glob": "^3.2.11",
"local-pkg": "^0.4.2",
"magic-string": "^0.26.2",
"mlly": "^0.5.4",
"mlly": "^0.5.5",
"pathe": "^0.3.2",
"scule": "^0.2.1",
"strip-literal": "^0.4.0",
......@@ -5009,16 +5042,16 @@
}
},
"node_modules/unplugin-auto-import": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.9.3.tgz",
"integrity": "sha512-S3fC/kp98v+HhELCCG4jm4fhd/BbXhhcmFxxQ/JHXefLPtz9WTCOsSq3pq7U4D94xJ0eyZOPo/56Y9iUf3kskw==",
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.10.1.tgz",
"integrity": "sha512-aBvlCOvkgZRceYDEIEpduD86XYCS1wV4atNeUtAZsNK7FSKRb0Nu073SYYAeU46IitK3GPeGd5BETtqz6It5Ng==",
"dev": true,
"dependencies": {
"@antfu/utils": "^0.5.2",
"@rollup/pluginutils": "^4.2.1",
"local-pkg": "^0.4.2",
"magic-string": "^0.26.2",
"unimport": "^0.4.5",
"unimport": "^0.6.3",
"unplugin": "^0.7.2"
},
"engines": {
......@@ -5142,9 +5175,9 @@
}
},
"node_modules/video.js": {
"version": "7.19.2",
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.19.2.tgz",
"integrity": "sha512-+rV/lJ1bDoMW3SbYlRp0eC9//RgvfBpEQ0USOyx44tHVxVyMjq+G9jZoiulsDXaIp4BX9q5+/y87TbZUysXBHA==",
"version": "7.20.1",
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.20.1.tgz",
"integrity": "sha512-QMuj+bjwvLId9SY8uBAjO9sw7pCDhdVzJtwsAwg1MdVLXgVuxhhSYswdsdsRk+YMssHtReopINclvDlTGTxMLA==",
"dependencies": {
"@babel/runtime": "^7.12.5",
"@videojs/http-streaming": "2.14.2",
......@@ -5304,12 +5337,13 @@
}
},
"node_modules/vue-tsc": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.38.5.tgz",
"integrity": "sha512-AFlqvwpENOTTJxS1Gl1uG0ZVsvtGCbgv9d0i4fXk5Pnao/ETVwWewPEsj+4cPlwa5htO9WhK6qfWwoqcCqg0yQ==",
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.39.0.tgz",
"integrity": "sha512-Hjm1C8T4ooNb5UBUqe0h7uCvV7Ff5UlWG4YgATVYREodafA4WxZIjE8v8wUG8mtyBDSaXXmg0J592i4jo3olug==",
"dev": true,
"dependencies": {
"@volar/vue-typescript": "0.38.5"
"@volar/vue-language-core": "0.39.0",
"@volar/vue-typescript": "0.39.0"
},
"bin": {
"vue-tsc": "bin/vue-tsc.js"
......@@ -5601,6 +5635,12 @@
"integrity": "sha512-f4A+++lGZGJvVSgeyMkqA7BEf2BVQli6F+qEykKb49c5ieWQBkfpn6CP5c1IZr2Yi2Ofl6Fj+v0e1fN18Z8Cnw==",
"dev": true
},
"@types/file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==",
"dev": true
},
"@types/json-schema": {
"version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
......@@ -5774,53 +5814,73 @@
}
},
"@vitejs/plugin-vue": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.0.0.tgz",
"integrity": "sha512-yWP34ArFh/jAeNUDkkLz/kVRLjf5ppJiq4L36f64Cp6dIrMQeYZGDP9xxdemlXfZR9ylN9JgHUl3GzfqOtgYDg==",
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.0.1.tgz",
"integrity": "sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==",
"dev": true,
"requires": {}
},
"@volar/code-gen": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.38.5.tgz",
"integrity": "sha512-GRGhPKoNtRwZyn9M0b2buobeMR1Aj9zxZI0osanLG9vB9YCnJov1myxKU8EJV5NobpyspLIv1X6/BEHLZNsKig==",
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.39.0.tgz",
"integrity": "sha512-56ycx16FoeDrjVuQ2RKIRmk3paFuIG4eIZLMpxypGKOlhFxS9/nB2eumln2e1jVlnAWeTcFw5V1/eYpDTazHLA==",
"dev": true,
"requires": {
"@volar/source-map": "0.38.5"
"@volar/source-map": "0.39.0"
}
},
"@volar/source-map": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.38.5.tgz",
"integrity": "sha512-TyTLkOtAW/7qnl4Gabt4W4vcKPBPCBdaPLKwkMglKcaX70lPH2CIwZcPMJo6PAilbUVXcuX86xfgdncWDKKaZQ==",
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.39.0.tgz",
"integrity": "sha512-sV/eDeOjBwDJxrxwP/ifABvlOUzjpUpCbtbAhoc9hD9SrHlaDGrKtnmXdqgH5DNHIfm5aUpY0xojRvFFOubpuw==",
"dev": true
},
"@volar/typescript-faster": {
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/typescript-faster/-/typescript-faster-0.39.0.tgz",
"integrity": "sha512-+NNY456ABrvXD2VsJGsH4BGQTWkSyWcUfdbcREqXD+g2GotW7UtkFMtNgu1ASXBhKl7oRdPuRk5wK9Edw2tW9A==",
"dev": true,
"requires": {
"semver": "^7.3.7"
}
},
"@volar/vue-code-gen": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.38.5.tgz",
"integrity": "sha512-4t2bX2bCmmlyYwPLqfH3AJXj9Km79uRmCy81recc8LB8ZT2Z9hOFNBAnlGNcCeZAtVWtmHVV7sXJtQAJQxkWeg==",
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.39.0.tgz",
"integrity": "sha512-0KqocSt5o4TtmUngq+8tmWRfifgyE9eDzb4/1Ih7bl52T1RDdOOKkZ9GzP3zBic3N7lJHiOaLdGMXTK+IzAe7g==",
"dev": true,
"requires": {
"@volar/code-gen": "0.38.5",
"@volar/source-map": "0.38.5",
"@volar/code-gen": "0.39.0",
"@volar/source-map": "0.39.0",
"@vue/compiler-core": "^3.2.37",
"@vue/compiler-dom": "^3.2.37",
"@vue/shared": "^3.2.37"
}
},
"@volar/vue-typescript": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-0.38.5.tgz",
"integrity": "sha512-Gobtg5gxR3bf/l1h300OWCWkvDQnOINgnxkDYiF8qdTBalW6qGsgGmq0uLBBDLaoahrfM7rqNd5QfJwGBgFXZg==",
"@volar/vue-language-core": {
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-0.39.0.tgz",
"integrity": "sha512-MnXnrIB7PtggLfKcLtg9I5X1i5FMCoTC+jYtR/j5RZU97boPbFi0lYLysCGPUXdP3w5taIXGPgfT8VnbLEkndQ==",
"dev": true,
"requires": {
"@volar/code-gen": "0.38.5",
"@volar/source-map": "0.38.5",
"@volar/vue-code-gen": "0.38.5",
"@volar/code-gen": "0.39.0",
"@volar/source-map": "0.39.0",
"@volar/vue-code-gen": "0.39.0",
"@vue/compiler-sfc": "^3.2.37",
"@vue/reactivity": "^3.2.37"
}
},
"@volar/vue-typescript": {
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-0.39.0.tgz",
"integrity": "sha512-RV+oHtkuta/kwskg02Ykp9qvDXpgDNF1EVgeGx42v1b65qMyAd5FgxOZxYYCzVV4DzVa6gH+C5YhuQXo4oEdog==",
"dev": true,
"requires": {
"@volar/code-gen": "0.39.0",
"@volar/typescript-faster": "0.39.0",
"@volar/vue-language-core": "0.39.0"
}
},
"@vue/compiler-core": {
"version": "3.2.37",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
......@@ -5944,36 +6004,36 @@
"requires": {}
},
"@vueuse/core": {
"version": "8.9.3",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.3.tgz",
"integrity": "sha512-q2pr3N7FPG7IBBhEXTYOJU+38VwKMLP5IfD33byzBV4Th7f1JHT4qPKvJrvr17knAefPRzNqgt9et+xFqaRlPQ==",
"version": "8.9.4",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.4.tgz",
"integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==",
"requires": {
"@types/web-bluetooth": "^0.0.14",
"@vueuse/metadata": "8.9.3",
"@vueuse/shared": "8.9.3",
"@vueuse/metadata": "8.9.4",
"@vueuse/shared": "8.9.4",
"vue-demi": "*"
},
"dependencies": {
"@vueuse/shared": {
"version": "8.9.3",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.3.tgz",
"integrity": "sha512-foorYQAU3CGknAO1w9No/rpGBJmb7L74MPltnZAYxeBRfhsajjJYYgja+D5IT2vT+/a0NciISaVp3fDwMN1ocA==",
"version": "8.9.4",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.4.tgz",
"integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==",
"requires": {
"vue-demi": "*"
}
},
"vue-demi": {
"version": "0.13.4",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.4.tgz",
"integrity": "sha512-KP4lq9uSz0KZbaqCllRhnxMV3mYRsRWJfdsAhZyt5bV5O1RTpoeDptBRV9NOa/JgOpfaA9ane88VF7OjWNK/DA==",
"version": "0.13.5",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.5.tgz",
"integrity": "sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==",
"requires": {}
}
}
},
"@vueuse/metadata": {
"version": "8.9.3",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.3.tgz",
"integrity": "sha512-57gZZKtWAmcJaUBmciCohvmumVLz4+FnoVnWj7U5BWs5PC2/7gU9Z0/i1i9leDNeboAauFzAq7z1GjS8eYnT+w=="
"version": "8.9.4",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.4.tgz",
"integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw=="
},
"@xmldom/xmldom": {
"version": "0.7.5",
......@@ -6485,9 +6545,9 @@
"dev": true
},
"element-plus": {
"version": "2.2.9",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.9.tgz",
"integrity": "sha512-jYbL0JkCdv95rkT6trZJjCAizLPySa0qcd2cgq+57SKQnCZAcNDDq4GbTuFRnNavdoeCJnuM3HIficTIUpsMOQ==",
"version": "2.2.10",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.10.tgz",
"integrity": "sha512-hJ+LlbRN3POu4Idl1LXB+SHSWdi+wwmdsoDXdQT2ynGuwzZsMYiusOooYXyEsPlrizeLibdnNGNDx4TIjXQvUg==",
"requires": {
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.0.6",
......@@ -7051,6 +7111,11 @@
"flat-cache": "^3.0.4"
}
},
"file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"file-uri-to-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz",
......@@ -7889,12 +7954,12 @@
}
},
"mlly": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-0.5.4.tgz",
"integrity": "sha512-gFlsLWCjVwu/LM/ZfYUkmnbBoz7eyBIMUwVQYDqhd8IvtNFDeZ95uwAyxHE2Xx7tQwePQaCo4fECZ9MWFEUTgQ==",
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-0.5.5.tgz",
"integrity": "sha512-2R4JT/SxRDPexomw4rmHYY/gWAGmL9Kkq1OR76Ua6w+P340a1aBDTWzKo2kAlxzrG82OdXs5VB9Lmcmyit0Obg==",
"dev": true,
"requires": {
"pathe": "^0.3.1",
"pathe": "^0.3.2",
"pkg-types": "^0.3.3"
}
},
......@@ -8633,9 +8698,9 @@
"dev": true
},
"sass": {
"version": "1.53.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz",
"integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==",
"version": "1.54.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz",
"integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==",
"dev": true,
"requires": {
"chokidar": ">=3.0.0 <4.0.0",
......@@ -9016,9 +9081,9 @@
}
},
"unimport": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/unimport/-/unimport-0.4.5.tgz",
"integrity": "sha512-DnmiSt/HQIfhdcxOy4CGqwZDBh3WHg33euX1ge4X8hvquKBmw2PFvhoAJaBKxscOz0oYosoPoPT4tkDZWHhV0Q==",
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/unimport/-/unimport-0.6.3.tgz",
"integrity": "sha512-+DVHqCoOoJcmYRLUrKbKDs/Iq/is6m0K7rTdFJAV7/MfyvWCKeSuSOrLeONgLBd6yC6iZFEzdc8di7S27PQyoA==",
"dev": true,
"requires": {
"@rollup/pluginutils": "^4.2.1",
......@@ -9026,7 +9091,7 @@
"fast-glob": "^3.2.11",
"local-pkg": "^0.4.2",
"magic-string": "^0.26.2",
"mlly": "^0.5.4",
"mlly": "^0.5.5",
"pathe": "^0.3.2",
"scule": "^0.2.1",
"strip-literal": "^0.4.0",
......@@ -9075,16 +9140,16 @@
}
},
"unplugin-auto-import": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.9.3.tgz",
"integrity": "sha512-S3fC/kp98v+HhELCCG4jm4fhd/BbXhhcmFxxQ/JHXefLPtz9WTCOsSq3pq7U4D94xJ0eyZOPo/56Y9iUf3kskw==",
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.10.1.tgz",
"integrity": "sha512-aBvlCOvkgZRceYDEIEpduD86XYCS1wV4atNeUtAZsNK7FSKRb0Nu073SYYAeU46IitK3GPeGd5BETtqz6It5Ng==",
"dev": true,
"requires": {
"@antfu/utils": "^0.5.2",
"@rollup/pluginutils": "^4.2.1",
"local-pkg": "^0.4.2",
"magic-string": "^0.26.2",
"unimport": "^0.4.5",
"unimport": "^0.6.3",
"unplugin": "^0.7.2"
},
"dependencies": {
......@@ -9189,9 +9254,9 @@
}
},
"video.js": {
"version": "7.19.2",
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.19.2.tgz",
"integrity": "sha512-+rV/lJ1bDoMW3SbYlRp0eC9//RgvfBpEQ0USOyx44tHVxVyMjq+G9jZoiulsDXaIp4BX9q5+/y87TbZUysXBHA==",
"version": "7.20.1",
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.20.1.tgz",
"integrity": "sha512-QMuj+bjwvLId9SY8uBAjO9sw7pCDhdVzJtwsAwg1MdVLXgVuxhhSYswdsdsRk+YMssHtReopINclvDlTGTxMLA==",
"requires": {
"@babel/runtime": "^7.12.5",
"@videojs/http-streaming": "2.14.2",
......@@ -9298,12 +9363,13 @@
}
},
"vue-tsc": {
"version": "0.38.5",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.38.5.tgz",
"integrity": "sha512-AFlqvwpENOTTJxS1Gl1uG0ZVsvtGCbgv9d0i4fXk5Pnao/ETVwWewPEsj+4cPlwa5htO9WhK6qfWwoqcCqg0yQ==",
"version": "0.39.0",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.39.0.tgz",
"integrity": "sha512-Hjm1C8T4ooNb5UBUqe0h7uCvV7Ff5UlWG4YgATVYREodafA4WxZIjE8v8wUG8mtyBDSaXXmg0J592i4jo3olug==",
"dev": true,
"requires": {
"@volar/vue-typescript": "0.38.5"
"@volar/vue-language-core": "0.39.0",
"@volar/vue-typescript": "0.39.0"
}
},
"webpack-sources": {
......
......@@ -15,33 +15,35 @@
"dependencies": {
"@element-plus/icons-vue": "^2.0.6",
"@tinymce/tinymce-vue": "^5.0.0",
"@vueuse/core": "^8.9.3",
"@vueuse/core": "^8.9.4",
"axios": "^0.27.2",
"blueimp-md5": "^2.19.0",
"element-plus": "^2.2.9",
"element-plus": "^2.2.10",
"file-saver": "^2.0.5",
"pinia": "^2.0.16",
"qs": "^6.11.0",
"video.js": "^7.19.2",
"video.js": "^7.20.1",
"vue": "^3.2.37",
"vue-router": "^4.1.2"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.1.0",
"@types/blueimp-md5": "^2.18.0",
"@types/file-saver": "^2.0.5",
"@types/node": "^16.11.43",
"@types/qs": "^6.9.7",
"@types/video.js": "^7.3.42",
"@vitejs/plugin-vue": "^3.0.0",
"@vitejs/plugin-vue": "^3.0.1",
"@vue/eslint-config-typescript": "^11.0.0",
"@vue/tsconfig": "^0.1.3",
"ali-oss": "^6.17.1",
"eslint": "^8.5.0",
"eslint-plugin-vue": "^9.2.0",
"npm-run-all": "^4.1.5",
"sass": "^1.53.0",
"sass": "^1.54.0",
"typescript": "~4.7.4",
"unplugin-auto-import": "^0.9.3",
"unplugin-auto-import": "^0.10.1",
"vite": "^3.0.2",
"vue-tsc": "^0.38.5"
"vue-tsc": "^0.39.0"
}
}
......@@ -63,8 +63,8 @@ export function getQuestionCategory(params: { project_tag: string }) {
return httpRequest.get(`/api/qbs/admin/v2/question-category/tree/${params.project_tag}`, { params })
}
// 获取试题分类
export function collectionResource(params: {
// 收藏/取消收藏
export function collectionResource(data: {
course_id: string
semester_id: string
chapter_id: string
......@@ -73,5 +73,5 @@ export function collectionResource(params: {
type: number
status: number
}) {
return httpRequest.get('/api/saas/api/v1/collection/resource', { params })
return httpRequest.post('/api/saas/api/v1/collection/resource', data)
}
<script setup lang="ts">
interface Props {
resource_type: number
type: string
resourceType: number
}
defineProps<Props>()
</script>
<template>
<img src="@/assets/images/icon_chapter.png" />
<div class="icon-resource">
<img src="@/assets/images/icon_mp4.png" v-if="resourceType === 2" />
<img src="@/assets/images/icon_work.png" v-else-if="resourceType === 3" />
<img src="@/assets/images/icon_exam.png" v-else-if="resourceType === 9" />
<img src="@/assets/images/icon_doc.png" v-else />
<!-- <img src="@/assets/images/icon_ppt.png" v-else-if="resourceType === 10" />
<img src="@/assets/images/icon_rar.png" v-else-if="resourceType === 4" /> -->
</div>
</template>
<style lang="scss">
.icon-resource {
display: inline-block;
img {
margin-right: 10px;
width: 14px;
}
}
</style>
import { collectionResource } from '@/api/base'
export function toggleCollectionResource(params) {
return collectionResource(params).then(res => {
console.log(res)
})
export async function useCollectionResource(params: {
course_id: string
semester_id: string
chapter_id: string
section_id: string
source_id: string
type: number
status: number
}) {
const res = await collectionResource(params)
console.log(res)
}
......@@ -21,11 +21,23 @@ export function topCourse(data: { id: string; status: number }) {
export function getCourse(params: { course_id: string; semester_id: string }) {
return httpRequest.get(`/api/saas/api/v1/course/${params.course_id}/detail/${params.semester_id}`, { params })
}
// 获取章节列表
export function getChapterTreeList(data: { course_id: string; semester_id: string }) {
return httpRequest.post('/api/saas/api/v1/chapter/tree', data)
}
// 收藏/取消收藏
export function collectionResource(data: {
course_id: string
semester_id: string
chapter_id: string
section_id: string
source_id: string
type: number
status: number
}) {
return httpRequest.post('/api/saas/api/v1/collection/resource', data)
}
// 获取大作业详情
export function getCourseWork(data: { course_id: string; semester_id: string }) {
return httpRequest.post('/api/saas/api/v1/job/detail', data)
......
<script setup lang="ts">
import type { CourseType } from '@/types'
import type { CourseListItemTypes } from '../types'
import { useMapStore } from '@/stores/map'
import { topCourse } from '../api'
import { ElMessage } from 'element-plus'
interface Props {
data: CourseType
data: CourseListItemTypes
}
const props = defineProps<Props>()
......@@ -28,7 +28,7 @@ const electiveTypeText = computed(() => {
// 是否选中
const isActive = computed(() => props.data.course_id === courseId)
// 置顶
function handleTop(data: CourseType) {
function handleTop(data: CourseListItemTypes) {
topCourse({ id: data.id, status: data.is_top ? 0 : 1 }).then(() => {
emit('change')
ElMessage.success('操作成功')
......
<!-- 学习 -->
<script setup lang="ts">
import { Star } from '@element-plus/icons-vue'
import type { ChapterType } from '@/types'
import * as api from '../api'
let chapterList = $ref<ChapterType[]>([])
import type { CourseChapterTypes, CourseSectionTypes, CourseResourceTypes } from '../types'
import ResourceIcon from '@/components/ResourceIcon.vue'
import { getChapterTreeList, collectionResource } from '../api'
let chapterList = $ref<CourseChapterTypes[]>([])
const { query } = useRoute()
const courseId = $ref(query.course_id as string)
const semesterId = $ref(query.semester_id as string)
......@@ -12,13 +13,35 @@ function fetchList() {
if (!courseId || !semesterId) {
return
}
api.getChapterTreeList({ course_id: courseId, semester_id: semesterId }).then(res => {
getChapterTreeList({ course_id: courseId, semester_id: semesterId }).then(res => {
chapterList = res.data.items
})
}
onMounted(() => {
fetchList()
})
// 是否可以收藏
function canCollection(data: CourseResourceTypes) {
return [4, 2, 10, 11, 3].includes(data.resource_type)
}
// 收藏/取消收藏
function toggleCollection(resource: CourseResourceTypes, section: CourseSectionTypes, chapter: CourseChapterTypes) {
// 资源类型: 1章节,2视频,3作业,4其他,6腾讯会议,9考试,10课件,11教案
// 收藏类型: 1其他, 2视频,3课件,4教案,5作业,6帖子
const typeMap: Record<number, number> = { 4: 1, 2: 2, 10: 3, 11: 4, 3: 5 }
collectionResource({
course_id: courseId,
semester_id: semesterId,
chapter_id: chapter.id,
section_id: section.id,
source_id: resource.resource_id,
type: typeMap[resource.resource_type],
status: resource.collection_count > 0 ? 0 : 1
}).then(res => {
resource.collection_count = resource.collection_count > 0 ? 0 : 1
console.log(res)
})
}
</script>
<template>
<el-collapse class="course-chapters">
......@@ -28,16 +51,22 @@ onMounted(() => {
<el-collapse-item :name="section.id" v-for="section in item.sections" :key="section.id">
<template #title><i class="icon-chapter"></i>{{ item.name }}</template>
<ul>
<li v-for="resource in section.resources" :key="resource.id">
<li class="course-resource-item" v-for="resource in section.resources" :key="resource.id">
<router-link
:to="`/course/player?course_id=${courseId}&section_id=${
section.id
}&semester_id=${semesterId}&&source_id=${resource.info?.source_id || ''}`"
target="_blank"
>
<ResourceIcon :resourceType="resource.resource_type" />
{{ resource.name }}
</router-link>
<el-icon><Star /></el-icon>
<i
class="icon-star"
:class="!!resource.collection_count ? 'is-active' : ''"
@click="toggleCollection(resource, section, item)"
v-if="canCollection(resource)"
></i>
</li>
</ul>
</el-collapse-item>
......@@ -47,7 +76,7 @@ onMounted(() => {
</template>
<style lang="scss" scoped>
li {
.course-resource-item {
display: flex;
align-items: center;
padding: 0 48px 0 60px;
......@@ -56,6 +85,21 @@ li {
border-bottom: 1px solid #e6e6e6;
a {
flex: 1;
&:hover {
color: var(--main-color);
}
}
}
.icon-star {
display: inline-block;
width: 16px;
height: 16px;
background: url(@/assets/images/icon_star.png) no-repeat;
background-size: contain;
cursor: pointer;
&.is-active {
background: url(@/assets/images/icon_star_hover.png) no-repeat;
background-size: contain;
}
}
.icon-chapter {
......@@ -63,7 +107,7 @@ li {
display: inline-block;
width: 12px;
height: 14px;
background: url(@/assets/images/icon_chapter.png);
background: url(@/assets/images/icon_chapter.png) no-repeat;
background-size: contain;
}
.course-chapters {
......
......@@ -37,9 +37,11 @@ const update = () => {
})
}
// 获取作业
let workInfo = $ref('')
function fetchInfo() {
getCourseWork({ course_id: courseId, semester_id: semesterId }).then(res => {
const { detail } = res.data
const { detail, essay } = res.data
workInfo = essay
Object.assign(form, detail)
})
}
......@@ -49,18 +51,52 @@ onMounted(() => {
</script>
<template>
<el-form ref="formRef" :model="form" :rules="rules" hide-required-asterisk label-position="top" disabled>
<el-form-item label="作业标题" prop="old_password">
<el-input v-model="form.title" />
</el-form-item>
<el-form-item label="作业正文" prop="password">
<el-input type="textarea" v-model="form.content" />
</el-form-item>
<el-form-item label="上传附件" prop="password_r">
<AppUpload v-model="form.attachments" disabled></AppUpload>
</el-form-item>
<el-form-item>
<el-button type="primary" round auto-insert-space @click="handleSubmit">保存</el-button>
</el-form-item>
</el-form>
<div class="course-work">
<div class="course-work-item">
<h2>作业说明</h2>
<div v-html="workInfo"></div>
</div>
<div class="course-work-item">
<h2>上传作业</h2>
<el-form
ref="formRef"
:model="form"
:rules="rules"
hide-required-asterisk
label-position="top"
:disabled="disabled"
>
<el-form-item label="作业标题" prop="old_password">
<el-input v-model="form.title" />
</el-form-item>
<el-form-item label="作业正文" prop="password">
<el-input type="textarea" v-model="form.content" />
</el-form-item>
<el-form-item label="上传附件" prop="password_r">
<AppUpload v-model="form.attachments" :disabled="disabled"></AppUpload>
</el-form-item>
<div style="text-align: center">
<el-button type="primary" round auto-insert-space @click="handleSubmit">保存</el-button>
</div>
</el-form>
</div>
</div>
</template>
<style lang="scss" scoped>
.course-work {
h2 {
font-size: 16px;
font-weight: 500;
line-height: 28px;
color: #333;
padding-bottom: 10px;
}
}
.course-work-item {
padding: 20px 0;
}
.course-work-item + .course-work-item {
border-top: 1px dashed #e6e6e6;
}
</style>
import type { CourseType, ChapterType, ResourceType } from '@/types'
export interface CourseListParamsTypes {
[key: string]: any
elective_types: string[]
id: string
semester_ids: string[]
elective_types: string[]
}
export interface CourseListItemTypes extends CourseType {
schedule: string
section?: ChapterType
semester_id: string
watch_video_length: number
}
// 课程章类型
export interface CourseChapterTypes {
id: string
name: string
resource_id: string
resource_type: number
sections: CourseSectionTypes[]
}
// 课程节类型
export interface CourseSectionTypes {
id: string
name: string
resource_id: string
resource_type: number
resources: CourseResourceTypes[]
}
// 课程资源类型
export interface CourseResourceTypes {
id: string
name: string
resource_id: string
resource_type: number
collection_count: number
info: ResourceType
}
export interface PlayItemTypes {
......
<script setup lang="ts">
import CourseListSearch from '../components/CourseListSearch.vue'
import CourseListItem from '../components/CourseListItem.vue'
import type { CourseType } from '@/types'
import type { CourseListParamsTypes } from '../types'
import type { CourseListParamsTypes, CourseListItemTypes } from '../types'
import { getCourseList } from '../api'
// 列表参数
const listParams = reactive<CourseListParamsTypes>({ id: '', semester_ids: [], elective_types: [] })
let courseList = $ref<CourseType[]>([])
let courseList = $ref<CourseListItemTypes[]>([])
// 获取课程列表
function fetchList() {
const params = Object.assign({}, listParams, {
......
......@@ -26,10 +26,7 @@ const electiveTypeText = computed(() => {
const detail = reactive<CourseType>({
id: '',
course_id: '',
semester_id: '',
schedule: '',
represent: '',
watch_video_length: 0,
is_finished: 0,
is_top: 0,
name: '',
......
import httpRequest from '@/utils/axios'
// 获取收藏列表
export function getCollectionList(params?: { type?: string; course_id?: string; semester_id?: string }) {
return httpRequest.get('/api/saas/api/v1/collection/list', { params })
}
// 收藏/取消收藏
export function collectionResource(data: {
course_id: string
semester_id: string
chapter_id: string
section_id: string
source_id: string
type: number
status: number
}) {
return httpRequest.post('/api/saas/api/v1/collection/resource', data)
}
// 获取所有课程
export function getCourseList() {
return httpRequest.get('/api/saas/api/v1/course/all')
}
import type { CourseType, ResourceType } from '@/types'
export interface CollectionType {
chapter_id: string
course_id: string
id: string
info: ResourceType
section_id: string
semester_id: string
semester: CollectionSemesterType
source_id: string
status: number
type: number
}
export interface CollectionSemesterType {
id: string
name: string
}
export type AllCourseType = Pick<CourseType, 'id' | 'name' | 'course_id' | 'cover' | 'semester'>
<script setup lang="ts">
const tabValue = $ref('')
import type { CollectionType, AllCourseType } from '../types'
import ResourceIcon from '@/components/ResourceIcon.vue'
import { Download } from '@element-plus/icons-vue'
import { saveAs } from 'file-saver'
import { getCollectionList, getCourseList, collectionResource } from '../api'
const tabs = $ref([
{ label: '全部', value: '' },
{ label: '视频', value: '1' },
{ label: '课件', value: '2' },
{ label: '教案', value: '3' },
{ label: '作业', value: '4' },
{ label: '帖子', value: '5' },
{ label: '其它资料', value: '6' }
{ label: '视频', value: '2' },
{ label: '课件', value: '3' },
{ label: '教案', value: '4' },
{ label: '作业', value: '5' },
{ label: '帖子', value: '6' },
{ label: '其它资料', value: '1' }
])
// 收藏列表
const params = reactive({
type: '',
course_id: '',
semester_id: ''
})
let list = $ref<CollectionType[]>([])
function fetchList() {
getCollectionList(params).then(res => {
list = res.data.items?.map((item: CollectionType) => {
item.status = 1
return item
})
})
}
// 所有课程列表
let courseList = $ref<AllCourseType[]>([])
const courseActive = $ref()
function fetchCourseList() {
getCourseList().then(res => {
courseList = res.data.items || []
})
}
function handleCourseChange(data: AllCourseType) {
params.course_id = data.course_id || ''
params.semester_id = data.semester?.id || ''
fetchList()
}
onMounted(() => {
fetchList()
fetchCourseList()
})
// 收藏/取消收藏
function toggleCollection(data: CollectionType) {
collectionResource({
course_id: data.course_id,
semester_id: data.semester_id,
chapter_id: data.chapter_id,
section_id: data.section_id,
source_id: data.source_id,
type: data.type,
status: data.status ? 0 : 1
}).then(() => {
data.status = data.status ? 0 : 1
})
}
// 是否可以下载
function canDownload(type: number) {
return [1, 3, 4, 5].includes(type)
}
// 下载资源
function downloadFile(data: CollectionType) {
data.info.url && saveAs(data.info.url, data.info.name)
}
</script>
<template>
<AppCard>
<el-tabs v-model="tabValue">
<el-tabs v-model="params.type" @tab-change="fetchList">
<el-tab-pane v-for="item in tabs" :label="item.label" :name="item.value" :key="item.value"></el-tab-pane>
</el-tabs>
<el-select></el-select>
<el-select v-model="courseActive" placeholder="所属课程" @change="handleCourseChange" clearable value-key="id">
<el-option v-for="item in courseList" :key="item.id" :label="item.name" :value="item" />
</el-select>
<ul v-if="list.length">
<li class="collection-item" v-for="item in list" :key="item.id">
<p>
<router-link
:to="`/course/player?course_id=${item.course_id}&section_id=${item.section_id}&semester_id=${item.semester_id}&source_id=${item.info?.source_id}`"
target="_blank"
>
<ResourceIcon :resourceType="item.type" />
{{ item.info.name || item.info.paper_title }}
</router-link>
</p>
<div class="actions">
<i class="icon-star" :class="!!item.status ? 'is-active' : ''" @click="toggleCollection(item)"></i>
<i class="icon-download" @click="downloadFile(item)" v-if="canDownload(item.type)"><Download /></i>
</div>
</li>
</ul>
<el-empty description="暂无数据" v-else />
</AppCard>
</template>
<style lang="scss" scoped>
.collection-item {
display: flex;
align-items: center;
height: 48px;
border-bottom: 1px solid #e6e6e6;
p {
flex: 1;
line-height: 48px;
}
&:hover {
color: var(--main-color);
}
.actions {
width: 60px;
display: flex;
align-items: center;
justify-content: space-between;
}
}
.icon-star {
display: inline-block;
width: 16px;
height: 16px;
background: url(@/assets/images/icon_star.png) no-repeat;
background-size: contain;
cursor: pointer;
&.is-active {
background: url(@/assets/images/icon_star_hover.png) no-repeat;
background-size: contain;
}
}
.icon-download {
display: inline-block;
width: 16px;
height: 16px;
cursor: pointer;
}
</style>
......@@ -8,41 +8,41 @@ export interface IMenuItem {
children?: IMenuItem[]
}
// 用户信息
// 用户类型
export interface UserType {
avatar: string
email: string
id: string
mobile: string
name: string
email: string
username: string
avatar: string
}
// 项目信息
// 项目类型
export interface ProjectType {
id: string
tab: string
name: string
tab: string
}
// 机构信息
// 机构类型
export interface OrganizationType {
contact_information: string
contact_name: string
id: string
is_valid: 1 | 2
name: string
contact_name: string
contact_information: string
validity_date: string
is_valid: 1 | 2
}
// 角色信息
// 角色类型
export interface RoleType {
desc: string
id: string
name: string
desc: string
}
// 权限信息
// 权限类型
export interface PermissionType {
desc: string
effect_uris: string
......@@ -50,33 +50,29 @@ export interface PermissionType {
name: string
parent_id: string
system_tag: number
type: number
tag: string
type: number
}
// 课程信息
// 课程类型
export interface CourseType {
id: string
course_id: string
semester_id: string
schedule: string
represent: string
watch_video_length: number
cover: string
credit: number
elective_type: number
id: string
is_finished: number
is_top: number
lecturers?: LecturerType[]
name: string
cover: string
elective_type: number
online_type: number
section?: ChapterType
semester: SemesterType
credit: number
previous_preparation: string
represent: string
semester: SemesterType
target: string
lecturers?: LecturerType[]
}
// 章节信息
// 章节类型
export interface ChapterType {
id: string
name: string
......@@ -85,7 +81,7 @@ export interface ChapterType {
is_finished: number
}
// 学期信息
// 学期类型
export interface SemesterType {
id: string
name: string
......@@ -93,9 +89,22 @@ export interface SemesterType {
end_time?: string
}
// 讲师类型
export interface LecturerType {
avatar: string
id: string
name: string
avatar: string
summarize: string
}
// 资源类型
export interface ResourceType {
id: string
knowledge_points: string
name: string
pdf?: string
url?: string
size: number
source_id: string
paper_title?: string
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论