- assets/vendor 全量迁移: fontawesome5→assets/fontawesome5, css→assets/css, js→assets/js/runtime(避开 14 个同名自有文件), img 合并去重→assets/img, fonts→assets/fonts; 删除 assets/vendor - libs 五个与 widgets/third-party 字节相同的库不重复入库, loader paths 改指向 - 运行时切换: _win.uri=assets 根, loader baseUrl=/js/runtime, enlighter 注入 路径同步; PHP 7 个引用文件切换并改名 $zibll_*→$runtime_* - 去品牌: Qinver 头注释/品牌 console.log/演示链接清除, 默认文案中性化 - 功能标识符改名: zib__→aksrt__, zib_ajax→aksrt_ajax, window.zib→ window.aksrtLegacy, zibllblock/*→aksrtblock/*, .zib-widget→.aksrt-panel, .zib-slider→.aksrt-slider, zib_menu_options meta 键等 - 自有 CSS 改名: legacy-utilities/compat-vars/footer shell - admin SPA 重建; 契约测试同步(路径/断言/文件更名) - 例外保留: tests/visual 对照环境与 fixtures 前缀(外部 Zibll 产品引用) 验证: php -l 133 个改动文件通过; runtime 86 个 JS node --check 通过; 契约测试 68/70(2 个失败经 stash 对照确认为存量问题)
310 lines
11 KiB
JavaScript
310 lines
11 KiB
JavaScript
'use strict';
|
|
|
|
function miniupload() {
|
|
var _body = $('body');
|
|
var input_selector = '[aksrtupload="image_upload"]';
|
|
var submit_selector = '[aksrtupload="submit"]';
|
|
var form_selector = '.form-upload,.mini-upload,form';
|
|
|
|
var add_html = '<div class="add"></div>';
|
|
var add_selector = '.add';
|
|
var mini_file = {};
|
|
|
|
var pre_html;
|
|
|
|
_body.on('change', input_selector, function (e) {
|
|
var _this = $(this);
|
|
var files = this.files || e.dataTransfer.files;
|
|
var form = $(_this.parents(form_selector)[0]);
|
|
|
|
var size_max = _this.attr('size_max') || Number(_win.upload_img_size) || 3;
|
|
|
|
var pre_selector = _this.attr('data-preview') || '.preview';
|
|
var pre = form.find(pre_selector);
|
|
pre_html = pre.html();
|
|
|
|
var accept = _this.attr('accept'); //允许上传的文件类型
|
|
var multiple = _this.attr('multiple'); //是否允许多选
|
|
var multiple_max = _this.attr('multiple_max'); //多选最多允许几个
|
|
|
|
var accept_yanz = false;
|
|
if (-1 !== accept.indexOf('image')) {
|
|
accept_yanz = 'image';
|
|
}
|
|
if (-1 !== accept.indexOf('vedio')) {
|
|
accept_yanz = 'vedio';
|
|
}
|
|
|
|
var upload_id = _this.attr('upload_id');
|
|
//设置唯一ID标识
|
|
if (!_this.attr('upload_id')) {
|
|
upload_id = parseInt((Math.random() + 1) * Math.pow(10, 4));
|
|
_this.attr('upload_id', upload_id);
|
|
}
|
|
|
|
if (!mini_file[upload_id]) {
|
|
mini_file[upload_id] = [];
|
|
}
|
|
|
|
$.each(files, function (key, val) {
|
|
var name = val.name;
|
|
if (accept_yanz && -1 == val.type.indexOf(accept_yanz)) {
|
|
//如果限制文件格式
|
|
notyf(aksrt_sprintf('upload_format_error', name), 'danger'), _this.val('');
|
|
} else if (size_max && val.size > size_max * 1048567) {
|
|
//限制文件大小
|
|
notyf(aksrt_sprintf('upload_size_exceeded', name, size_max), 'danger');
|
|
} else if (!pre.find('[preview-name="' + name + '"]').length) {
|
|
//不允许重复文件
|
|
mini_file[upload_id].push(val);
|
|
}
|
|
});
|
|
|
|
var a_file = [];
|
|
|
|
var ii = 1;
|
|
var empty = false;
|
|
$.each(mini_file[upload_id], function (key, val) {
|
|
if (multiple_max && multiple_max < ii) {
|
|
//限制文件数量
|
|
notyf(aksrt_sprintf('upload_count_exceeded', multiple_max), 'danger');
|
|
return false;
|
|
} else {
|
|
ii++;
|
|
a_file.push(val);
|
|
ToB64(val, function (e) {
|
|
var img = '<img class="fit-cover" preview-name="' + val.name + '" src="' + e + '">';
|
|
if (multiple) {
|
|
if (!empty) {
|
|
pre.html('');
|
|
empty = true;
|
|
}
|
|
var cloce = '<div class="preview-remove" upload-id="' + upload_id + '" file-key="' + $.inArray(val, a_file) + '"><svg class="ic-close" aria-hidden="true"><use xlink:href="#icon-close"></use></svg></div>';
|
|
img = '<div class="preview-item">' + img + cloce + '</div>';
|
|
pre.append(img).find(add_selector).remove();
|
|
if (multiple_max && multiple_max >= ii) {
|
|
pre.append(add_html);
|
|
}
|
|
} else {
|
|
pre.html(img);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
mini_file[upload_id] = a_file;
|
|
form.find('[auto-submit]').click();
|
|
});
|
|
|
|
_body.on('click', '.preview-remove', function () {
|
|
var _this = $(this);
|
|
var file_key = _this.attr('file-key');
|
|
var upload_id = _this.attr('upload-id');
|
|
_this.parent().animate(
|
|
{
|
|
width: 0,
|
|
},
|
|
200,
|
|
'swing',
|
|
function () {
|
|
var pre = $(this).parent();
|
|
$(this).remove();
|
|
mini_file[upload_id].splice(file_key, 1);
|
|
if (!pre.find(add_selector).length) {
|
|
pre.append(add_html);
|
|
}
|
|
}
|
|
);
|
|
return false;
|
|
});
|
|
|
|
_body.on('click', '.preview ' + add_selector, function () {
|
|
var _this = $(this);
|
|
var form = $(_this.parents(form_selector)[0]);
|
|
form.find(input_selector).click();
|
|
});
|
|
|
|
//提交表单
|
|
_body.on('click', submit_selector, function (e) {
|
|
var _this = $(this);
|
|
if (_this.attr('disabled')) {
|
|
return false;
|
|
}
|
|
|
|
if (e.preventDefault) e.preventDefault();
|
|
else e.returnValue = false;
|
|
|
|
var _text = _this.html();
|
|
var form = $(_this.parents(form_selector)[0]);
|
|
var _input = form.find(input_selector);
|
|
var formData = new FormData();
|
|
|
|
//循环插入文件
|
|
var is_files = _this.attr('aksrtupload-nomust');
|
|
|
|
_input.each(function () {
|
|
var _this = $(this);
|
|
var upload_id = _this.attr('upload_id');
|
|
if (upload_id && mini_file[upload_id]) {
|
|
var ii = 0;
|
|
var tag = _this.attr('data-tag') || 'file';
|
|
$.each(mini_file[upload_id], function (key, val) {
|
|
var append_tag = ii ? tag + '_' + ii : tag;
|
|
formData.append(append_tag, val, val.name);
|
|
ii++;
|
|
});
|
|
if (ii > 1) {
|
|
formData.append(tag + '_file_count', ii);
|
|
}
|
|
is_files = ii;
|
|
}
|
|
});
|
|
|
|
//必须选择图片判断
|
|
if (!is_files) return notyf(aksrt__('upload_select_first'), 'danger');
|
|
|
|
//添加其它数据
|
|
var serializeObject = form.serializeObject();
|
|
$.each(serializeObject, function (key, val) {
|
|
formData.append(key, val);
|
|
});
|
|
|
|
//循环插入_POST内容
|
|
form.find('[data-name]').each(function () {
|
|
var _th = $(this);
|
|
var n = _th.attr('data-name');
|
|
var v = _th.val() || _th.attr('data-value');
|
|
if (v === undefined) {
|
|
v = '';
|
|
}
|
|
if (formData.get(n) === null) {
|
|
formData.append(n, v);
|
|
}
|
|
});
|
|
|
|
//人机验证
|
|
if (formData.get('captcha_mode') && is_captcha(formData.get('captcha_mode'))) {
|
|
tbquire(['captcha'], function () {
|
|
CaptchaOpen(_this, formData.get('captcha_mode'));
|
|
});
|
|
return !1;
|
|
}
|
|
|
|
if (window.captcha) {
|
|
if (window.captcha._this) {
|
|
delete window.captcha._this;
|
|
}
|
|
|
|
formData.append('captcha', JSON.stringify(window.captcha));
|
|
window.captcha = {}; //只能使用一次
|
|
}
|
|
|
|
/**
|
|
for (var [a, b] of formData.entries()) {
|
|
console.log(a, b);
|
|
} */
|
|
|
|
var miniuploaded = function (no_preview_reset) {
|
|
_this.attr('disabled', false).html(_text);
|
|
_input
|
|
.attr('disabled', false)
|
|
.val('')
|
|
.each(function () {
|
|
var _this = $(this);
|
|
var upload_id = _this.attr('upload_id');
|
|
if (upload_id && mini_file[upload_id]) {
|
|
mini_file[upload_id] = [];
|
|
}
|
|
});
|
|
if (!no_preview_reset && pre_html) {
|
|
form.find('.preview').html(pre_html);
|
|
}
|
|
};
|
|
|
|
var notyf_id = 'miniupload_ajax';
|
|
notyf(aksrt__('processing_wait'), 'load', '', notyf_id);
|
|
_this.attr('disabled', true).html('<span class="miniupload-ing"><i class="loading mr3 c-white"></i><span class="loading-text c-white">' + aksrt__('uploading') + '<count class="px12 ml3"></count></span><div class="progress progress-striped active"><div class="progress-bar progress-bar-success" role="progressbar" style="width:0;"></div></div></span>');
|
|
_input.attr('disabled', true);
|
|
|
|
$.ajax({
|
|
url: _win.ajax_url,
|
|
type: 'POST',
|
|
data: formData,
|
|
// 告诉jQuery不要去处理发送的数据
|
|
processData: false,
|
|
cache: false,
|
|
// 告诉jQuery不要去设置Content-Type请求头
|
|
contentType: false,
|
|
dataType: 'json',
|
|
error: function (n) {
|
|
var _msg = aksrt_sprintf('ajax_error', n.status, n.statusText);
|
|
if (aksrt_is_fatal_error_response(n.responseText)) {
|
|
_msg = aksrt__('ajax_fatal_error');
|
|
}
|
|
notyf(_msg, 'danger', '', notyf_id);
|
|
miniuploaded();
|
|
},
|
|
xhr: jqXhr(function (e) {
|
|
var percent = Math.round((e.loaded / e.total) * 100);
|
|
_this.find('count').html(percent + '%');
|
|
percent >= 100 && _this.find('.loading-text').html(aksrt__('upload_processing') + ' ...');
|
|
form.find('.progress .progress-bar').css('width', percent + '%');
|
|
}),
|
|
success: function (n) {
|
|
if (n.error) {
|
|
_win.slidercaptcha = false;
|
|
}
|
|
var ys = n.ys ? n.ys : n.error ? 'danger' : '';
|
|
notyf(n.msg || aksrt__('operation_success'), ys, '', notyf_id);
|
|
miniuploaded(n.no_preview_reset);
|
|
if (n.hide_modal) {
|
|
$(_this.parents('.modal')[0]).modal('hide');
|
|
}
|
|
if (n.url && n.replace_img) {
|
|
$('img' + n.replace_img).attr('src', n.url);
|
|
}
|
|
if (n.reload) {
|
|
if (n.goto) {
|
|
window.location.href = n.goto;
|
|
window.location.reload;
|
|
} else {
|
|
window.location.reload();
|
|
}
|
|
}
|
|
_this.trigger('miniuploaded', n, form);
|
|
},
|
|
});
|
|
});
|
|
|
|
//图片转Base64
|
|
function ToB64(e, n) {
|
|
if ('undefined' == typeof FileReader) return notyf(aksrt__('upload_unsupported'), 'danger');
|
|
var r = new FileReader();
|
|
r.readAsDataURL(e),
|
|
(r.onload = function (e) {
|
|
n && n(e.target.result);
|
|
});
|
|
}
|
|
|
|
//绑定上传进度
|
|
function jqXhr(fun) {
|
|
jqXhr.onprogress = fun;
|
|
//使用闭包实现监听绑
|
|
return function () {
|
|
//通过$.ajaxSettings.xhr();获得XMLHttpRequest对象
|
|
var xhr = $.ajaxSettings.xhr();
|
|
//判断监听函数是否为函数
|
|
if (typeof jqXhr.onprogress !== 'function') return xhr;
|
|
//如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
|
|
if (jqXhr.onprogress && xhr.upload) {
|
|
xhr.upload.onprogress = jqXhr.onprogress;
|
|
}
|
|
return xhr;
|
|
};
|
|
}
|
|
}
|
|
|
|
if (!_win.is_miniupload) {
|
|
miniupload();
|
|
_win.is_miniupload = true;
|
|
}
|