layui.define(['upload', 'element', 'ajax'], function (exports) { let $ = layui.$; let layer = layui.layer; let layuiUpload = layui.upload; let element = layui.element; let ajax = layui.ajax; let ICON = { file: 'fa-file-o', image: 'fa-file-image-o', video: 'fa-file-movie-o', audio: 'fa-file-sound-o', } /** * 渲染表格行 * @param name * @param fileArray * @param icon * @param hasShow * @param isImgPreview */ function renderItem(name, fileArray, icon, hasShow, isImgPreview) { if(isImgPreview) { let imgs = ''; $.each(fileArray, function (index, item) { imgs += `
加载失败
`; }); let container = $(`#${name}ImgPreviewContainer`); container.empty(); container.append(imgs); } else { let trs = ''; $.each(fileArray, function (index, item) { let showButton = hasShow ? `` : ''; trs += ` ${item.name}
${showButton}
`; }); let tBody = $(`#${name}ContainerTBody`).append(trs); tBody.empty(); tBody.append(trs); } } /** * 渲染表格 * @param name * @param explain * @param isUpload * @param isImgPreview */ function render(name, explain, isUpload, isImgPreview) { let uploadBtn = isUpload ? `
` : ''; if(isImgPreview) { $(`#${name}Container`).append(` ${uploadBtn}
`); } else { $(`#${name}Container`).append(` ${uploadBtn}
`); } } /** * 文件文本转数组 * @param files * @return {*[]} */ function files2FileArray(files) { if (!files) { return []; } let fileArray = []; $.each(files.split(','), function (index, item) { let idNameArray = item.split(':'); fileArray.push({ id: idNameArray[0], name: idNameArray[1] }) }); return fileArray; } /** * 文件数组转文本 * @param fileArray */ function fileArray2Files(fileArray) { let files = []; $.each(fileArray, function (index, item) { files.push(item.id + ':' + item.name.replace(/,/g, ',')); }) return files.join(','); } /** * 上传 * @param params */ function upload(params) { let inputElem = params.inputElem; let files = inputElem.val(); let fileArray = files2FileArray(files); let isUpload = params.isUpload; let hasShow = !!(params.field === 'image' || params.field === 'video' || params.field === 'audio' || params.onShow); let isImgPreview = typeof(params.isImgPreview) === 'undefined' ? false : params.isImgPreview; let isVideoPreview = typeof(params.isVideoPreview) === 'undefined' ? false : params.isVideoPreview; let isAudioPreview = typeof(params.isAudioPreview) === 'undefined' ? false : params.isAudioPreview; render(params.name, params.explain, isUpload, isImgPreview); renderItem(params.name, fileArray, params.fileIcon, hasShow, isImgPreview); renderUploadBtn(params.name, fileArray, params.maxCount); /** * 渲染上传按钮 */ function renderUploadBtn(name, fileArray, maxCount) { let btn = $(`#${name}UploadBtn`); if (fileArray.length < maxCount) { btn.removeClass('layui-btn-disabled'); btn.attr('disabled', false); } else { btn.addClass('layui-btn-disabled'); btn.attr('disabled', true); } } /** * 渲染上传 */ function renderUpload() { layuiUpload.render({ elem: `#${params.name}UploadBtn`, url: params.url, accept: params.accept, acceptMime: params.acceptMime.join(','), field: params.field, exts: params.exts.join('|'), headers: params.headers, name: params.name, before: function (obj) { }, done: function (res, index, upload) { setTimeout(function () { element.progress(`${params.name}UploadProcess`, '0%'); }, 800); let file = res.data; fileArray.push({ id: file.fileId, name: file.fileName }); renderItem(params.name, fileArray, params.fileIcon, hasShow, isImgPreview); renderUploadBtn(params.name, fileArray, params.maxCount); inputElem.val(fileArray2Files(fileArray)); }, error: function (index, upload) { layer.msg('上传失败'); }, progress: function (n, elem, res, index) { element.progress(`${params.name}UploadProcess`, n + '%'); } }); } function addEvent() { let containerElem = $(`#${params.name}Container`); if(isImgPreview) { // 图片显示 containerElem.on('click', '.img-container', function() { let dataset = this.dataset; console.log(dataset); let id = dataset.id; let name = dataset.name; top.dialog.photos({ fileId: id, fileName: name }); }); } if(isVideoPreview) { // 视频 containerElem.on('click', '.file-show', function () { let index = parseInt(this.dataset.index); let file = fileArray[index]; if (params.onShow) { params.onShow(file); } else { top.dialog.video({ fileId: file.id }) } }); } if(isAudioPreview) { containerElem.on('click', '.file-show', function () { let index = parseInt(this.dataset.index); let file = fileArray[index]; if (params.onShow) { params.onShow(file); } else { top.dialog.audio({ fileId: file.id }) } }); } containerElem.on('click', '.file-download', function () { let index = parseInt(this.dataset.index); let file = fileArray[index]; window.open(`route/file/v2/download/${file.id}`, '_blank'); }); containerElem.on('click', '.file-delete', function (e) { let index = parseInt(this.dataset.index); fileArray.splice(index, 1); renderItem(params.name, fileArray, params.fileIcon, hasShow, isImgPreview); renderUploadBtn(params.name, fileArray, params.maxCount); inputElem.val(fileArray2Files(fileArray)); e.stopPropagation(); }); } if (isUpload) { renderUpload(); } addEvent(); } /** * 设置通用配置 * @param params * @param opt */ function setCommonOpt(params, opt) { params.name = opt.name; params.explain = opt.explain; params.headers = opt.headers ? opt.headers : {}; params.isUpload = (typeof (opt.isUpload) === 'undefined' || opt.isUpload === null) ? true : opt.isUpload; params.onShow = opt.onShow && $.isFunction(opt.onShow) ? opt.onShow : null; params.inputElem = $(`#${opt.name}`); } /** * 上传图片 * @param opt */ function uploadImage(opt) { let params = {}; let isExtsConcat = !!opt.isExtsConcat; let exts = ['jpg', 'png', 'gif', 'bmp', 'jpeg']; let extArray = opt.exts; if (extArray && $.isArray(extArray)) { if (!isExtsConcat) { exts = extArray; } else { exts = exts.concat(extArray); } } let acceptMime = ['image/*']; let acceptMimeArray = opt.acceptMime; if (acceptMimeArray && $.isArray(acceptMimeArray)) { if (!isExtsConcat) { acceptMime = acceptMimeArray; } else { acceptMime = acceptMime.concat(acceptMimeArray); } } let isApp = !!opt.isApp; if (isApp) { params.url = ajax.path('app/file/v2/upload-image{release}', [!!opt.isAppRelease ? '-release' : '']); } else { params.url = ajax.path('api/file/v2/upload-image', []); } params.exts = exts; params.acceptMime = acceptMime; params.accept = 'images'; params.field = 'image'; params.fileIcon = ICON.image; params.maxCount = opt.maxCount ? opt.maxCount : 6; params.isImgPreview = true; setCommonOpt(params, opt); upload(params); } /** * 上传视频 * @param opt */ function uploadVideo(opt) { let params = {}; let isApp = !!opt.isApp; if (isApp) { params.url = ajax.path('app/file/v2/upload-video{release}', [!!opt.isAppRelease ? '-release' : '']); } else { params.url = ajax.path('api/file/v2/upload-video', []); } let isExtsConcat = !!opt.isExtsConcat; let exts = ['mp4']; let extArray = opt.exts; if (extArray && $.isArray(extArray)) { if (!isExtsConcat) { exts = extArray; } else { exts = exts.concat(extArray); } } let acceptMime = ['video/mp4']; let acceptMimeArray = opt.acceptMime; if (acceptMimeArray && $.isArray(acceptMimeArray)) { if (!isExtsConcat) { acceptMime = acceptMimeArray; } else { acceptMime = acceptMime.concat(acceptMimeArray); } } params.exts = exts; params.acceptMime = acceptMime; params.accept = 'video'; params.field = 'video'; params.fileIcon = ICON.video; params.maxCount = opt.maxCount ? opt.maxCount : 1; params.isVideoPreview = true; setCommonOpt(params, opt); upload(params); } /** * 上传音频 * @param opt */ function uploadAudio(opt) { let params = {}; let isApp = opt.isApp ? opt.isApp : false; if (isApp) { params.url = ajax.path('app/file/v2/upload-audio{release}', [!!opt.isAppRelease ? '-release' : '']); } else { params.url = ajax.path('api/file/v2/upload-audio', []); } let isExtsConcat = !!opt.isExtsConcat; let exts = ['wav', 'mp3']; let extArray = opt.exts; if (extArray && $.isArray(extArray)) { if (!isExtsConcat) { exts = extArray; } else { exts = exts.concat(extArray); } } let acceptMime = ['audio/wav', 'audio/mp3']; let acceptMimeArray = opt.acceptMime; if (acceptMimeArray && $.isArray(acceptMimeArray)) { if (!isExtsConcat) { acceptMime = acceptMimeArray; } else { acceptMime = acceptMime.concat(acceptMimeArray); } } params.exts = exts; params.acceptMime = acceptMime; params.accept = 'audio'; params.field = 'audio'; params.fileIcon = ICON.audio; params.maxCount = opt.maxCount ? opt.maxCount : 1; params.isAudioPreview = true; setCommonOpt(params, opt); upload(params); } /** * 上传文件 * @param opt */ function uploadFile(opt) { let params = {}; let isApp = !!opt.isApp; if (isApp) { params.url = ajax.path('app/file/v2/upload-file{release}', [!!opt.isAppRelease ? '-release' : '']); } else { params.url = ajax.path('api/file/v2/upload-file', []); } let isExtsConcat = !!opt.isExtsConcat; let exts = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'wps', 'txt', 'rar', 'zip']; let extArray = opt.exts; if (extArray && $.isArray(extArray)) { if (!isExtsConcat) { exts = extArray; } else { exts = exts.concat(extArray); } } let acceptMime = [ 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.ms-works', 'text/plain', 'application/x-rar', 'application/x-zip-compressed' ]; let acceptMimeArray = opt.acceptMime; if (acceptMimeArray && $.isArray(acceptMimeArray)) { if (!isExtsConcat) { acceptMime = acceptMimeArray; } else { acceptMime = acceptMime.concat(acceptMimeArray); } } params.exts = exts; params.acceptMime = acceptMime; params.accept = 'file'; params.field = 'file'; params.fileIcon = ICON.file; params.maxCount = opt.maxCount ? opt.maxCount : 6; setCommonOpt(params, opt); upload(params); } exports('file', { uploadImage: uploadImage, uploadVideo: uploadVideo, uploadAudio: uploadAudio, uploadFile: uploadFile }); });