btxtgxq-system-population/target/classes/static/assets/layuiadmin/modules/file.js

459 lines
16 KiB
JavaScript
Raw Normal View History

2023-10-25 10:04:28 +08:00
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
});
});