btxtgxq-system-population/target/classes/static/assets/layuiadmin/modules/file.js
java_cuibaocheng@163.com 19d3a88fa0 基础人口信息
2023-10-25 10:25:13 +08:00

459 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
});
});