diff --git a/src/api/index.js b/src/api/index.js index 3f089c5..1e26727 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -13,6 +13,8 @@ export default { getSchoolIdByToken : `users/users/data/user/getSchoolIdByToken`, deleteProfile : `users/users/userInfo/deleteProfile`, refreshPageNotification : `nakadai/message/refreshPageNotification`, + + getPlayAuth: `${uploadURL}oss/manage/getPlayAuth`, // 获取播放凭证 platformLogList: `nakadai/nakadai/log/platformLogList`, logNotification: `nakadai/nakadai/log/logNotification`, @@ -304,14 +306,6 @@ export default { editSubsection: `occupationlab/occupationlab/theoreticalCourseSubsection/editSubsection`, // 修改小节 getSubsection: `occupationlab/occupationlab/theoreticalCourseSubsection/getSubsection`, // 根据小节id获取预览文件地址 - // 阿里云文件/视频管理 - fileDeletion: `${uploadURL}oss/manage/fileDeletion`, // 删除OSS文件 - fileupload: `${uploadURL}oss/manage/fileupload`, // 文件上传 - getPlayAuth: `${uploadURL}oss/manage/getPlayAuth`, // 获取播放凭证 - removeMoreVideo: `${uploadURL}oss/manage/removeMoreVideo`, // 批量删除视频文件 - removeVideo: `${uploadURL}oss/manage/removeVideo`, // 删除视频文件 - fileUploadNakadai: `${host}nakadai/nakadai/oss/fileUpload`, - queryProvince: `nakadai/nakadai/province/queryProvince`, //查询省份 queryCity: `nakadai/nakadai/city/queryCity`, //查询城市 querySchoolData: `nakadai/nakadai/school/querySchool`, //根据学校名称查询学校信息 diff --git a/src/components/editor.js b/src/components/editor.js index 5925c41..0176b2a 100644 --- a/src/components/editor.js +++ b/src/components/editor.js @@ -1,7 +1,4 @@ -import Axios from 'axios' -import Api from '@/api' -import Setting from '@/setting' -import Util from '@/libs/util' +import Oss from '@/components/upload/upload.js' import { Loading } from 'element-ui' export default { //skin:'oxide-dark', @@ -315,21 +312,25 @@ export default { powerpaste_allow_local_images: true, powerpaste_word_import: 'clean', powerpaste_html_import: 'clean', + urlconverter_callback: (url, node, onSave, name) => { + if (node === 'img' && url.startsWith('blob:')) { + // Do some custom URL conversion + tinymce.activeEditor && tinymce.activeEditor.uploadImages() + } + // Return new URL + return url + }, // 自定义上传 images_upload_handler: function (blobInfo, succFun, failFun) { - const form = new FormData() - form.append('file', blobInfo.blob()), - Axios({ - method: 'post', - url: Api.fileUploadNakadai, - data: form, - headers: { - 'Content-Type': 'multipart/form-data', - token: Util.local.get(Setting.tokenKey) - }, - }).then(({ data }) => { - succFun(data.filesResult.fileUrl) - }).catch(res => {}) + const blob = blobInfo.blob() + // blob转换为file + const file = new File([blob], blobInfo.filename(), { + type: 'application/json', + lastModified: Date.now() + }); + Oss.upload(file).then(res => { + succFun(res.url) + }) }, //自定义文件选择器的回调内容 此方法只有在点击上方图片按钮才会触发 file_picker_callback: function (callback, value, meta) { @@ -347,23 +348,13 @@ export default { input.setAttribute("accept", ".mp4"); input.onchange = function(){ let file = this.files[0]; - let fd = new FormData(); - fd.append("file", file); const load = Loading.service() - Axios({ - method: 'post', - url: Api.fileUploadNakadai, - data: fd, - headers: { - 'Content-Type': 'multipart/form-data', - token: Util.local.get(Setting.tokenKey) - }, - }).then(({ data }) => { - load.close() - callback(data.filesResult.fileUrl) - }).catch(res => { - load.close() - }) + Oss.upload(file).then(res => { + load.close() + callback(res.url) + }).catch(e => { + load.close() + }) } //触发点击 input.click(); diff --git a/src/components/quill/index.vue b/src/components/quill/index.vue index 1be6cf2..3128580 100644 --- a/src/components/quill/index.vue +++ b/src/components/quill/index.vue @@ -15,14 +15,16 @@ :style="styles" v-loading="loading"> - - 点击上传 - + + + 点击上传 + + { + // 把图片上传到oss,不然会直接把base64存到数据库 + Oss.upload(file).then(res => { var range = ins.getSelection() if (range) { // 在当前光标位置插入图片 - ins.insertEmbed(range.index, 'image', res.data.filesResult.fileUrl) + ins.insertEmbed(range.index, 'image', res.url) // 将光标移动到图片后面 ins.setSelection(range.index + 1) } - }).catch(res => { }) + }) }); } }, false) @@ -264,21 +264,26 @@ export default { this.loading = true; }, // quill图片上传 - editorUploadSuccess (res) { + editorUploadSuccess (file) { // 获取富文本组件实例 - let quill = this.Quill; + let quill = this.Quill // 如果上传成功 - if (res.data.filesResult.fileUrl) { + if (file.url) { // 获取光标所在位置 - let length = quill.getSelection().index; + let lengths; + if (quill.getSelection() == null) { + lengths = 1 + } else { + lengths = quill.getSelection().index; + } // 插入图片,res为服务器返回的图片链接地址 - quill.insertEmbed(length, "image", res.data.filesResult.fileUrl); + quill.insertEmbed(lengths, 'image', file.url) // 调整光标到最后 - quill.setSelection(length + 1); + quill.setSelection(lengths + 1) } else { - util.successMsg("图片插入失败"); + this.$message.success('图片插入失败') } - this.loading = false; + this.loading = false }, // 类型切换回调 @@ -288,19 +293,9 @@ export default { // markdown图片上传 imgAdd (pos, $file) { let $vm = this.$refs.md - // 第一步.将图片上传到服务器. - const formData = new FormData(); - formData.append('file', $file); - axios({ - url: this.api.fileupload, - method: 'post', - data: formData, - headers: { - token: this.token, - 'Content-Type': 'multipart/form-data' - }, - }).then((res) => { - $vm.$img2Url(pos, res.data.data.filesResult.fileUrl); + // 将图片上传到oss + Oss.upload($file).then(res => { + $vm.$img2Url(pos, res.url); }) }, } diff --git a/src/components/upload/index.vue b/src/components/upload/index.vue index a33f14a..313635f 100644 --- a/src/components/upload/index.vue +++ b/src/components/upload/index.vue @@ -102,7 +102,7 @@ export default { this.uploading = true this.showFiles = false // 上传到阿里云oss - const { name } = await this.client.multipartUpload(file.name, file, { + const { name } = await this.client.multipartUpload(Date.now() + '.' + Util.getFileExt(file.name), file, { progress: this.handleProgress }); diff --git a/src/components/upload/upload.js b/src/components/upload/upload.js index 6960f2a..02566ed 100644 --- a/src/components/upload/upload.js +++ b/src/components/upload/upload.js @@ -17,7 +17,7 @@ export default { return new Promise(async (resolve, reject) => { try { // 上传到阿里云oss - const res = await client.multipartUpload(file.name, file); + const res = await client.multipartUpload(Date.now() + '.' + Util.getFileExt(file.name), file); resolve({ format: Util.getFileExt(file.name), name: file.name, diff --git a/src/pages/activity/manage/add/index.vue b/src/pages/activity/manage/add/index.vue index c961834..d3da267 100644 --- a/src/pages/activity/manage/add/index.vue +++ b/src/pages/activity/manage/add/index.vue @@ -16,15 +16,13 @@ + action="" + :http-request="handleRequest"> @@ -42,15 +40,13 @@ + action="" + :http-request="handleRequestLg"> @@ -154,23 +150,11 @@ :height="400" /> - - 点击上传 - - 支持扩展名:.rar .zip .doc .docx .pdf .jpg... - - + @@ -191,6 +175,8 @@ import util from "@/libs/util"; import quill from "@/components/quill"; import Setting from "@/setting"; +import Upload from '@/components/upload'; +import Oss from '@/components/upload/upload.js' export default { data () { return { @@ -236,6 +222,7 @@ export default { }, components: { quill, + Upload }, watch: { // 监听信息是否有更改,有的话页面离开的时候要询问是否要保存 @@ -319,10 +306,12 @@ export default { beforeRemove (file, fileList) { return this.$confirm(`确定移除 ${file.name}?`); }, - handleRemove (file, fileList) { + handleRemove () { + Oss.del(this.form.coverUrl) this.form.coverUrl = '' }, - handleCarouselRemove (file, fileList) { + handleCarouselRemove () { + Oss.del(this.form.carouselUrl) this.form.carouselUrl = '' }, uploadError (err, file, fileList) { @@ -332,20 +321,27 @@ export default { center: true }) }, - uploadSuccess (res) { - this.form.coverUrl = res.data.filesResult.fileUrl + // 封面自定义上传 + async handleRequest ({ file }) { + this.form.coverUrl && Oss.del(this.form.coverUrl) + Oss.upload(file).then(res => { + this.form.coverUrl = res.url + }) }, - uploadLgSuccess (res) { - this.form.carouselUrl = res.data.filesResult.fileUrl + // 封面自定义上传 + async handleRequestLg ({ file }) { + this.form.carouselUrl && Oss.del(this.form.carouselUrl) + Oss.upload(file).then(res => { + this.form.carouselUrl = res.url + }) }, // 附件上传成功 - uploadAnnexSuccess (res) { - const file = res.data.filesResult - const url = file.fileUrl || file.fileId + uploadAnnexSuccess (file) { + const url = file.url const data = { activityId: this.form.id || '', - fileName: this.fileName, - name: this.fileName, + fileName: file.name, + name: file.name, filePath: url, url } @@ -366,6 +362,7 @@ export default { } }, handleAnnexRemove (file, fileList) { + Oss.del(file.url) this.form.activityFileList = fileList }, // 随机邀请码 diff --git a/src/pages/activity/manage/manage/noticeDetail.vue b/src/pages/activity/manage/manage/noticeDetail.vue index 44913f8..0c7b771 100644 --- a/src/pages/activity/manage/manage/noticeDetail.vue +++ b/src/pages/activity/manage/manage/noticeDetail.vue @@ -26,24 +26,10 @@ :height="400" /> - - 点击上传 - - 支持扩展名:.rar .zip .doc .docx .pdf .jpg... - - + { }).catch(res => { }) + Oss.del(file.url) const id = this.form.announcementAnnexList.find(e => e.fileName === file.name).id this.$post(`${this.api.delActivityAnnouncementAnnex}?id=${id}`).then(res => { }).catch(res => { }) } diff --git a/src/pages/course/add/index.vue b/src/pages/course/add/index.vue index 9586fb3..69e7b2c 100644 --- a/src/pages/course/add/index.vue +++ b/src/pages/course/add/index.vue @@ -1,385 +1,428 @@ - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - 仅本校 - - - 全平台 - - - - - - - - - - - - - - - - - - - - - - 上传封面 - + + + + + + + + + + + + + + + + + + 仅本校 + + + 全平台 + + + + + + + + + + + + + + + + + + + + + + 上传封面 + - - 只能上传jpg/png文件 - 课程封面图将按2:1显示,最佳分辨率1400*700 - - - - - - - - {{ form.id ? "更新" : "创建" }} - - - - + + 只能上传jpg/png文件 + 课程封面图将按2:1显示,最佳分辨率1400*700 + + + + + + + + {{ form.id ? "更新" : "创建" }} + + + + @@ -395,7 +438,7 @@ $avatar-width: 104px; overflow: hidden; &:hover { - border-color: #409EFF; + border-color: #409eff; } .uploader-default { @@ -446,17 +489,18 @@ $avatar-width: 104px; /deep/ .d-inline-block { width: 216px; - .el-select, .el-input { + .el-select, + .el-input { width: 100%; } } .range-check { - display: inline-block; - margin: 0 0 10px 10px; + display: inline-block; + margin: 0 0 10px 10px; } /deep/.range-cas { - .el-tag { - display: none; - } + .el-tag { + display: none; + } } \ No newline at end of file diff --git a/src/pages/course/contentSettings/index.vue b/src/pages/course/contentSettings/index.vue index 6ba49aa..a2ca798 100644 --- a/src/pages/course/contentSettings/index.vue +++ b/src/pages/course/contentSettings/index.vue @@ -165,26 +165,15 @@ :close-on-click-modal="false"> - - 上传资源 - 视频请上传MP4格式,大小不超过30M;office文件大小不要超过10M - - + + + 视频请上传MP4格式,大小不超过30M;office文件大小不要超过10M + + - - 上传资源 - - + + + @@ -266,7 +243,7 @@ style="transform: scale(1) rotate(0deg);margin-top: -1px; max-height: 100%; max-width: 100%;"> - @@ -282,6 +259,16 @@ id="fileIframe" :src="iframeSrc" frameborder="0"> + + + 您的浏览器不支持 video 标签。 + @@ -360,7 +347,9 @@ import util from "@/libs/util"; import Setting from "@/setting"; import { Loading } from "element-ui"; import pdf from "@/components/pdf"; -import axios from 'axios' +import Upload from '@/components/upload'; +import Oss from '@/components/upload/upload.js' +import Util from '@/libs/util' export default { name: "contentSettings", @@ -388,6 +377,7 @@ export default { fileUrl: "", originalFileName: "", fileType: "", + videoSrc: '', playAuth: "", player: null, previewImg: "", @@ -425,7 +415,7 @@ export default { moved: false // 是否移动过 }; }, - components: { pdf }, + components: { pdf, Upload }, mounted () { this.insertScript(); this.id = this.$route.query.id; @@ -528,40 +518,12 @@ export default { `当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!` ); }, - // 自定义上传 - handleRequest (data) { - const param = new FormData() - param.append('file', data.file) - const config = { - timeout: 10000000000, - headers: { - 'Accept': '*/*', - 'Content-Type': 'multipart/form-data', - token: util.local.get(Setting.tokenKey) - }, - // 获取上传进度,自带的组件上传进度不准确 - onUploadProgress: progressEvent => { - const per = Number((progressEvent.loaded / progressEvent.total * 100).toFixed(2)) - if (this.progressPercent <= 80) this.progressPercent = (per > 80) ? (Math.random() * 10 + 80).toFixed(2) : per - } - } - axios.post(this.api.fileupload, param, config).then(res => { - this.progressPercent = 100 - this.showProgress = false - const { fileId, fileType, fileUrl, ossFileName } = res.data.data.filesResult - this.uploading = false - this.fileId = fileId - this.fileType = fileType - this.fileUrl = fileUrl - this.fileName = ossFileName - }) - }, - uploadSuccess (res, file, fileList) { - this.uploading = false; - this.fileId = res.data.filesResult.fileId; - this.fileType = res.data.filesResult.fileType; - this.fileUrl = res.data.filesResult.fileUrl; - this.fileName = res.data.filesResult.ossFileName; + uploadSuccess (file) { + this.uploading = false + this.fileId = '' + this.fileType = file.format + this.fileUrl = file.url + this.fileName = file.name }, uploadError (err, file, fileList) { this.$message({ @@ -576,7 +538,8 @@ export default { } }, handleRemove (file, fileList) { - this.uploadList = fileList; + Oss.del(this.fileUrl) + this.fileUrl = '' }, uploadSure () { this.importVisible = false; @@ -788,22 +751,26 @@ export default { }, preview (row) { if (this.transferType(row.fileType) == "视频") { - this.$get(`${this.api.getPlayAuth}/${row.fileId}`).then(res => { - this.playAuth = res.data.playAuth; - if (this.player) { - this.player.replayByVidAndPlayAuth(row.fileId, this.playAuth); - } else { - this.player = new Aliplayer({ - id: "player", - width: "100%", - autoplay: false, - vid: row.fileId, - playauth: this.playAuth, - encryptType: 1 //当播放私有加密流时需要设置。 - }); - } - }).catch(res => { - }); + // 阿里云视频点播 + if (row.fileId) { + this.$get(`${this.api.getPlayAuth}/${row.fileId}`).then(res => { + this.playAuth = res.data.playAuth; + if (this.player) { + this.player.replayByVidAndPlayAuth(row.fileId, this.playAuth); + } else { + this.player = new Aliplayer({ + id: "player", + width: "100%", + autoplay: false, + vid: row.fileId, + playauth: this.playAuth, + encryptType: 1 //当播放私有加密流时需要设置。 + }); + } + }).catch(res => { }); + } else { + this.videoSrc = row.fileUrl + } } else if (this.transferType(row.fileType) == "图片") { this.previewImg = row.fileUrl; } else if (row.fileType == "pdf") { @@ -880,23 +847,10 @@ export default { .catch(err => { }); }, - switchSubmit () { + async switchSubmit () { if (this.uploading) return util.warningMsg("资源正在上传中,请稍候"); if (!this.fileUrl && !this.fileId) return util.warningMsg("请上传资源"); - if (this.transferType(this.curFile.fileType) == "视频") { - let data = { - videoIdList: [this.sectionId] - }; - this.$del(`${this.api.removeVideo}/${this.curFile.fileId}`).then(res => { - this.switchSubmitFile(); - }).catch(res => { - }); - } else { - this.$del(`${this.api.fileDeletion}?keys=${this.curFile.fileName}`).then(res => { - this.switchSubmitFile(); - }).catch(res => { - }); - } + this.switchSubmitFile() }, delSection (row) { this.$confirm("此删除操作不可逆,是否确认删除选中项?", "提示", { @@ -960,6 +914,7 @@ export default { }, closeIframe () { this.iframeSrc = ""; + this.videoSrc = '' this.showMask = false; this.showMask1 = false; this.showMask2 = false; diff --git a/src/pages/information/addarticle/index.vue b/src/pages/information/addarticle/index.vue index 9eaee62..54211f7 100644 --- a/src/pages/information/addarticle/index.vue +++ b/src/pages/information/addarticle/index.vue @@ -1,247 +1,266 @@ - - - - + + + + + + + + + + + + + + 上传封面 - - - - - - - - - 上传封面 - - - - - - - - - - - - - - - - - - - - - 确定 - - - - + + + + + + + + + + + + + + + + + + + + 确定 + + + + @@ -257,7 +276,7 @@ $avatar-width: 104px; overflow: hidden; &:hover { - border-color: #409EFF; + border-color: #409eff; } .uploader-default { @@ -308,7 +327,8 @@ $avatar-width: 104px; /deep/ .d-inline-block { width: 216px; - .el-select, .el-input { + .el-select, + .el-input { width: 100%; } } diff --git a/src/pages/match/add/step1.vue b/src/pages/match/add/step1.vue index c4b0c72..0e77f9d 100644 --- a/src/pages/match/add/step1.vue +++ b/src/pages/match/add/step1.vue @@ -12,13 +12,11 @@ accept=".jpg,.png,.jpeg,.gif" :on-remove="handleRemove" :on-error="uploadError" - :on-success="uploadSuccess" :before-remove="beforeRemove" :limit="1" :on-exceed="handleExceed" - :action="this.api.fileupload" - :headers="headers" - name="file"> + action="" + :http-request="handleRequest"> @@ -38,13 +36,11 @@ accept=".jpg,.png,.jpeg,.gif" :on-remove="handleLgRemove" :on-error="uploadError" - :on-success="uploadLgSuccess" :before-remove="beforeRemove" :limit="1" :on-exceed="handleExceed" - :action="this.api.fileupload" - :headers="headers" - name="file"> + action="" + :http-request="handleRequestLg"> @@ -220,23 +216,10 @@ :readonly="!editing && form.id !== ''" /> - - 点击上传 - - 支持扩展名:.rar .zip .doc .docx .pdf .jpg... - - + @@ -287,6 +270,8 @@ import util from "@/libs/util"; import quill from "@/components/quill"; import Setting from "@/setting"; +import Upload from '@/components/upload'; +import Oss from '@/components/upload/upload.js' export default { props: ['editing'], data () { @@ -414,7 +399,8 @@ export default { }; }, components: { - quill + quill, + Upload }, watch: { editing: function (val) { @@ -600,24 +586,25 @@ export default { handleExceedAnnex (files, fileList) { util.warningMsg(`当前限制选择 5 个文件,如需更换,请删除一个文件再重新选择!`); }, - uploadSuccess (res) { - const { coverUrl } = this.form - coverUrl && this.$del(`${this.api.fileDeletion}?keys=${coverUrl}`).then(res => { }).catch(res => { }) - this.form.coverUrl = res.data.filesResult.fileUrl + // 封面自定义上传 + async handleRequest ({ file }) { + Oss.upload(file).then(res => { + this.form.coverUrl = res.url + }) }, - uploadLgSuccess (res) { - const { carouselUrl } = this.form - carouselUrl && this.$del(`${this.api.fileDeletion}?keys=${carouselUrl}`).then(res => { }).catch(res => { }) - this.form.carouselUrl = res.data.filesResult.fileUrl + // 封面自定义上传 + async handleRequestLg ({ file }) { + Oss.upload(file).then(res => { + this.form.carouselUrl = res.url + }) }, // 附件上传成功 - uploadAnnexSuccess (res) { - const file = res.data.filesResult + uploadAnnexSuccess (file) { const { id } = this.form const data = { competitionId: id || '', - fileName: this.fileName, - filePath: file.fileUrl || file.fileId + fileName: file.name, + filePath: file.url } this.form.competitionAnnexList.push(data) // 编辑的时候需要调新增附件接口 @@ -644,20 +631,17 @@ export default { beforeRemove (file, fileList) { return this.$confirm(`确定移除 ${file.name}?`); }, - handleRemove (file, fileList) { - this.$del(`${this.api.fileDeletion}?keys=${this.form.coverUrl}`).then(res => { - this.form.coverUrl = '' - }).catch(res => { }) + handleRemove () { + Oss.del(this.form.coverUrl) + this.form.coverUrl = '' }, - handleLgRemove (file, fileList) { - this.$del(`${this.api.fileDeletion}?keys=${this.form.carouselUrl}`).then(res => { - this.form.carouselUrl = '' - }).catch(res => { }) + handleLgRemove () { + Oss.del(this.form.carouselUrl) + this.form.carouselUrl = '' }, handleAnnexRemove (file, fileList) { - const { url, name } = file - url && this.$del(`${this.api.fileDeletion}?keys=${url}`).then(res => { }).catch(res => { }) - const id = this.form.competitionAnnexList.find(e => e.fileName === name).id + Oss.del(file.url) + const { id } = file id && this.$post(`${this.api.delComAnnex}?id=${id}`).then(res => { }).catch(res => { }) }, // 随机邀请码 diff --git a/src/pages/match/add/step3.vue b/src/pages/match/add/step3.vue index 08926ee..8bd8e18 100644 --- a/src/pages/match/add/step3.vue +++ b/src/pages/match/add/step3.vue @@ -62,12 +62,10 @@ + :http-request="res => handleRequest(res, item)"> 上传文件 @@ -137,6 +135,7 @@ @@ -256,7 +256,8 @@ $upload-lg-height: 150px; /deep/ .d-inline-block { width: 216px; - .el-select, .el-input { + .el-select, + .el-input { width: 100%; } } @@ -276,7 +277,7 @@ $upload-lg-height: 150px; .remove { width: 16px; height: 16px; - background: url("../../../assets/img/close.png") 0 0/cover no-repeat; + background: url('../../../assets/img/close.png') 0 0 / cover no-repeat; cursor: pointer; } } diff --git a/src/pages/system/list/logo.vue b/src/pages/system/list/logo.vue index 78cb6d4..3826a7a 100644 --- a/src/pages/system/list/logo.vue +++ b/src/pages/system/list/logo.vue @@ -1,190 +1,198 @@ - - 系统logo设置 - - - - - - - - - - 上传图标 - + + 系统logo设置 + + + + + + + + + + 上传图标 + - - 只能上传jpg/png文件 - 图标将按1:1显示,最佳分辨率100*100 - - - - - {{ form.id ? "更新" : "创建" }} - - - + + 只能上传jpg/png文件 + 图标将按1:1显示,最佳分辨率100*100 + + + + + {{ form.id ? "更新" : "创建" }} + + + \ No newline at end of file diff --git a/src/setting.js b/src/setting.js index 579056c..cfe673b 100644 --- a/src/setting.js +++ b/src/setting.js @@ -30,7 +30,7 @@ if (isPro) { uploadURL = `http://121.37.12.51/` host = "http://121.37.12.51/"; // 中台测试服 // host = 'https://www.occupationlab.com/' // 正式服 - // host = "http://192.168.31.217:9000/"; // 榕 + host = "http://192.168.31.217:9000/"; // 榕 // host = 'http://192.168.31.51:9000/'; // 赓 } else if (isSq) { zcPath = `10.20.100.204:8883`
支持扩展名:.rar .zip .doc .docx .pdf .jpg...
上传封面
只能上传jpg/png文件
课程封面图将按2:1显示,最佳分辨率1400*700
视频请上传MP4格式,大小不超过30M;office文件大小不要超过10M
上传图标
图标将按1:1显示,最佳分辨率100*100