328 lines
14 KiB
JavaScript
328 lines
14 KiB
JavaScript
![]() |
(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 = '<span title-timeout="100" title="sudo chmod -Rf 777 '+val+'">'+val+'</span>';
|
|||
|
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('<br/>'), 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']+' <b class="caret"></b>';
|
|||
|
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":"<i class='font-icon ri-user-line-3'></i>",
|
|||
|
"display":LNG['user.account'],
|
|||
|
"attr":{"placeholder":LNG['user.inputName']},
|
|||
|
"desc":LNG['user.rootName'],
|
|||
|
"require":"1"
|
|||
|
},
|
|||
|
"password":{
|
|||
|
"type":"password",
|
|||
|
"value":'',
|
|||
|
// "display":"<i class='font-icon ri-key-line'></i>",
|
|||
|
"display":LNG['common.password'],
|
|||
|
"attr":{"placeholder":LNG['user.inputPwd']},
|
|||
|
"desc":LNG['user.rootPwd'],
|
|||
|
"require":"1"
|
|||
|
},
|
|||
|
"password2":{
|
|||
|
"type":"password",
|
|||
|
"value":'',
|
|||
|
// "display":"<i class='font-icon ri-key-line'></i>",
|
|||
|
"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 = '<div class="ajaxError" style="font-size:14px;padding:40px;color:#FF9800;">' + error + '</div>';
|
|||
|
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']+'<hr>'+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);
|
|||
|
}
|
|||
|
});
|
|||
|
})();
|