(function(){ // 比较版本号:7.1.19 >= 5.3 var compareVers = function (ver1, ver2) { ver1 = ver1.toString(); ver2 = ver2.toString(); const pVer1 = ver1.split('.').map(Number); const pVer2 = ver2.split('.').map(Number); const mxLen = Math.max(pVer1.length, pVer2.length); for (var i = 0; i < mxLen; i++) { const v1 = pVer1[i] || 0; const v2 = pVer2[i] || 0; if (v1 > v2) return 1; if (v1 < v2) return -1; } return 0; } // 环境检测项赋值 var envView = function(){ var errList = []; var chkList = ['path_writable', 'php_version', 'allow_url_fopen']; // 检查项 var $table = $(".step-box.env .env-table"); request('install/index/env', {}, function(result){ tips && tips.close(); if (!result || !result.code) { Tips.tips(LNG['admin.install.envReqErr'], 'warning', 3000); $table.find('.row-state .icon').removeClass().addClass('icon icon-warn ri-more-fill'); return false; } var data = result.data; $table.find('.env-item-list>p').each(function(){ var key = $(this).attr('class'); var val = data[key]; var txt = ''; switch (key) { case 'path_writable': if (val !== true) { txt = ''+val+''; val = false; } break; case 'php_version': txt = val; val = compareVers(val, 5.3) > 0 ? true : false; break; case 'php_bit': txt = val; val = val == 64 ? true : false; break; default:break; } if (txt) $(this).find('.row-value').html(txt); var state = val === true ? 'success' : 'error'; $(this).find('.row-state .icon').removeClass().addClass('icon icon-'+state); if (val !== true) errList.push(key); }); var button = errList.length ? LNG['common.skip'] : LNG['common.nextStep']; $table.find(".form-target-save").removeClass('hidden'); $table.find(".form-save-button").text(button); // 使用帮助 if(errList.length) $table.find("a.help").removeClass('hidden'); }); // 绑定点击事件 $table.delegate('.form-save-button', 'click', function(){ var errs = _.intersection(errList, chkList); if(!errs.length) return stepNext(this, 1); var errMsg = [LNG['admin.install.ensureNoError']]; _.each(errs, function(value, i){ errMsg.push((i+1)+'.'+$table.find("."+value+">span:eq(0)").text()); }); Tips.tips(errMsg.join('
'), false, 3000); }); } // 数据库配置提交 var dbSave = function(FormData, update){ var update = update || false; var formMaker = new kodApi.formMaker({formData:FormData }); formMaker.renderTarget($(".step-box.db .db-table")); if(update) { $(".step-box.db .db-table").find('button,input').prop('disabled', true); $(".step-box.db .info-alert").removeClass('hidden'); } $(".step-box.db .form-save-button").text(LNG['common.ok']); $(".step-box.db .form-save-button").click(function(){ var data = formMaker.getValue(); if(!data) return false; var _this = this; data = $.extend({}, {action: 'db'}, data); var tips = Tips.loadingMask($('.content-main'),false,0.2); request('install/index/save', data, function(result){ tips.close(); // 是否删除已存在数据库 if(result.info && result.info == '10001'){ $.dialog.confirm(result.data,function(){ data.del = 1; dbSaveSet(_this, data); }); return false; } var delay = null; if(!result.code || (result.info && result.info == '10000')) delay = 5000; var msg = result.data || (LNG['explorer.error']+', '+LNG['admin.install.setPathWrt']); Tips.close(msg, result.code, delay); if(!result.code) return; stepNext(_this, 2); }, function(){ tips.close(); }); }); } /** * 数据库配置(删除旧数据)提交 * @param {*} _this * @param {*} data */ var dbSaveSet = function(_this, data){ var tips = Tips.loadingMask($('.content-main'),false,0.2); request('install/index/save', data, function(result){ tips.close(); var delay = !result.code ? 5000 : null; var msg = result.data || (LNG['explorer.error']+', '+LNG['admin.install.setPathWrt']); Tips.close(msg, result.code, delay); if(!result.code) return; stepNext(_this, 2); }, function(){ tips.close(); }); } /** * 管理员账号提交 * @param {*} formMaker * @returns */ var userSave = function (formMaker) { var data = formMaker.getValue(); Events.trigger('install.userSetStart',data); if(!data || !data.name || !data.password || !data.password2) return false; if (data.password != data.password2) { formMaker.setValue('password2', ''); Tips.tips(LNG['user.rootPwdEqual'], 'warning'); return false; } delete data.password2; // var _this = this; var _this = '.step-box.user .form-save-button'; // 为了和旧版统一,实际没有必要 data = $.extend({}, {action: 'user'}, data); var tips = Tips.loadingMask($('.content-main'),false,0.2); request('install/index/save', data, function(result){ tips.close(); var delay = !result.code ? 5000 : null; var msg = result.data || (LNG['explorer.error']+', '+LNG['admin.install.setPathWrt']); Tips.close(msg, result.code, delay); if(!result.code) return; // 显示admin账号密码 name = data.name; password = data.password; LocalData.del('fileHistoryLastPath-1'); var update = result.info || 0; stepLast(_this, update); // 安装成功,提示登录 }, function(){ tips.close(); }); } /** * 数据库、缓存配置 */ var dbView = function(){ var package = './app/controller/install/static/package.html' requireAsync(package, function(FormData){ // 获取json数据 FormData = FormData.replace(/\n/g,"").replace(/\r/g,""); //去掉字符串中的换行符 FormData = FormData.replace(/\n/g,"").replace(/\s|\xA0/g,""); //去掉字符串中的所有空格 FormData = eval('(' + FormData + ')'); //将字符串解析成json对象 FormData.redisMore.info.openMore.display = LNG['common.more']+' '; FormData.redisMore.info.openMore.className = 'btn btn-default btn-sm'; request('install/index/env', {db: 1}, function(result){ if(_.isEmpty(result.data)) return dbSave(FormData); _.each(FormData, function(value, key){ if(result.data[key]) value.value = result.data[key]; }); dbSave(FormData, true); }); }); } /** * 管理员账号配置 */ var name = ''; var password = ''; var userView = function(fast){ var auto = $('.install-box .install-fast').attr('auto'); var formData = { "name":{ "type":"input", "value":auto || 'admin', // "display":"", "display":LNG['user.account'], "attr":{"placeholder":LNG['user.inputName']}, "desc":LNG['user.rootName'], "require":"1" }, "password":{ "type":"password", "value":'', // "display":"", "display":LNG['common.password'], "attr":{"placeholder":LNG['user.inputPwd']}, "desc":LNG['user.rootPwd'], "require":"1" }, "password2":{ "type":"password", "value":'', // "display":"", "display":LNG['common.password'], "attr":{"placeholder":LNG['user.inputPwd']}, "desc":LNG['user.rootPwdRepeat'], "require":"1" }, }; var formMaker = new kodApi.formMaker({formData:formData }); formMaker.renderTarget($(".step-box.user .user-table")); Events.trigger('install.userSetReady',formMaker); tips && tips.close(); $(".step-box.user .form-save-button").text(LNG['common.ok']); $('.step-box.user .form-box input').keyEnter(function(){userSave(formMaker);}); $(".step-box.user .form-save-button").click(function(){userSave(formMaker);}); } // 下一步 var stepNext = function(_this, index){ $(_this).parents('.check-result').find('.progress-box>div:eq('+index+')').addClass('active'); $(_this).parents('.check-result').find('.step-box').addClass('hidden'); $(_this).parents('.step-box').next().removeClass('hidden'); } // 最后一步 var stepLast = function(_this, update){ $(_this).parents('.check-result').find('.title-box,.progress-box').addClass('hidden'); $(_this).parents('.content-main').children('.link').removeClass('hidden'); $(_this).parents('.check-result').find('.step-box').addClass('hidden'); $(_this).parents('.step-box').next().removeClass('hidden'); // 跳转登录 if(update) $(".step-box.msg .title").text(LNG['admin.install.updateSuccess']); var text = LNG['user.account']+": "+name+"    "+LNG['common.password']+": "+password; $(".step-box.msg .desc").html(text); var count = 5; var timer = null; timer = setInterval(function () { if (count > 0) { count = count - 1; $('.content-main .link .delay').text(count); } else { clearInterval(timer); window.location.href = $('.content-main .link a').attr('href'); } }, 1000); } var request = function(url, data, callback, callbackError){ // 兼容处理: https://qastack.cn/programming/26261001/warning-about-http-raw-post-data-being-deprecated data = data || {}; data._installTime = time(); $.ajax({ url:API_HOST + url, data:data, type: 'POST', dataType:'json', error: function (xhr, textStatus, errorThrown) { if(callbackError) callbackError(); var error = xhr.responseText; var dialog = $.dialog.list['ajaxErrorDialog']; if(error && !_.trim(error)) return;// 有内容,但内容为空白则不处理; Tips.close(LNG['explorer.systemError'], false); if (xhr.status == 0 && error == '') { error = LNG['explorer.networkError']; } error = '
' + error + '
'; if (!dialog) { $.dialog({ id: 'ajaxErrorDialog', padding: 0, width: '60%', height: '65%', fixed: true, resize: true, title: 'Ajax Error', content: '' }); } $.iframeHtml($(".ajaxErrorDialog .aui-content"), error); }, success: function(data) { callback(data); } }); } var tips = window.Tips ? window.Tips.loadingMask() : null; Events.bind('windowReady',function(){ try { // 检测是否为一键安装,一键安装直接展示账号界面 var fast = parseInt($('.install-box .install-fast').attr('fast')); if(!fast) { envView(); // 1.环境配置 dbView(); // 2.数据库配置 } userView(fast); // 3.管理员账号配置 new kodApi.copyright(); $(".content-main-message .body").perfectScroll(); } catch(e) { tips && tips.close(); console.error(e); var msg = LNG['admin.install.pageError']+'
'+e; Tips.notify({icon:"error",title:LNG['common.tips'],content:msg}); _.delay(function(){ if ($('.progress-box>.active:last').attr('data') == 'env') { var $env = $(".step-box.env"); if (!$env.hasClass('hidden') && $env.find('.form-target-save').hasClass('hidden')) { $env.find('.env-table .row-state .icon').removeClass().addClass('icon icon-warn ri-more-fill'); } } }, 1000); } }); })();