459 lines
16 KiB
JavaScript
459 lines
16 KiB
JavaScript
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 += `
|
||
<div class="img-container" data-index="${index}" data-id="${item.id}" data-name="${item.name}">
|
||
<img src="route/file/v2/download/true/${item.id}" alt="加载失败" title="${item.name}">
|
||
<button type="button" class="layui-btn layui-btn-xs layui-btn-danger file-delete" data-index="${index}" title="删除"><i class="fa fa-trash"></i></button>
|
||
</div>
|
||
`;
|
||
});
|
||
let container = $(`#${name}ImgPreviewContainer`);
|
||
container.empty();
|
||
container.append(imgs);
|
||
} else {
|
||
let trs = '';
|
||
$.each(fileArray, function (index, item) {
|
||
let showButton = hasShow ? `<button type="button" class="layui-btn layui-btn-xs layui-btn-normal file-show" data-index="${index}" title="查看"><i class="fa fa-search"></i></button>` : '';
|
||
trs += `
|
||
<tr>
|
||
<td><i class="fa ${icon}"></i> ${item.name}</td>
|
||
<td class="btn-group">
|
||
<div class="layui-btn-group">
|
||
${showButton}
|
||
<button type="button" class="layui-btn layui-btn-xs file-download" data-index="${index}" title="下载"><i class="fa fa-download"></i></button>
|
||
<button type="button" class="layui-btn layui-btn-xs layui-btn-danger file-delete" data-index="${index}" title="删除"><i class="fa fa-trash"></i></button>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
`;
|
||
});
|
||
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 ? `
|
||
<div class="btn-process">
|
||
<button type="button" id="${name}UploadBtn" class="layui-btn layui-btn-primary layui-border-blue layui-upload-file-btn"><i class="fa fa-upload"></i> ${explain}</button>
|
||
<div id="${name}UploadProcess" class="layui-progress" lay-filter="${name}UploadProcess">
|
||
<div class="layui-progress-bar layui-bg-blue"></div>
|
||
</div>
|
||
</div>
|
||
` : '';
|
||
if(isImgPreview) {
|
||
$(`#${name}Container`).append(`
|
||
${uploadBtn}
|
||
<div id="${name}ImgPreviewContainer" class="img-preview-container"></div>
|
||
`);
|
||
} else {
|
||
$(`#${name}Container`).append(`
|
||
${uploadBtn}
|
||
<table id="${name}Table" class="layui-table">
|
||
<colgroup>
|
||
<col>
|
||
<col width="100">
|
||
</colgroup>
|
||
<tbody id="${name}ContainerTBody"></tbody>
|
||
</table>
|
||
`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 文件文本转数组
|
||
* @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
|
||
});
|
||
}); |