Files
yakpanel-core/YakPanel/static/js/soft.js

4610 lines
267 KiB
JavaScript
Raw Normal View History

2026-04-07 02:04:22 +05:30
var soft = {
is_install: false,
trail:0,//是否试用
is_setup:false,
is_setup_name:"",
refresh_data:[],
get_list: function(page, type, search) {
if (page == undefined || page == 'null' || page == 'undefined') page = 0;
if (type == undefined || type == 'null' || type == 'undefined') type = 0;
if (!search) search = $("#SearchValue").val();
if (search == undefined || search == 'null' || search == 'undefined' || search == '') search = undefined;
var _this = this, commonly_software = $('#commonly_software');
var istype = getCookie('softType');
if(istype == 'undefined' || istype == 'null' || !istype){
istype = 0;
}
if (type == 0) type = bt.get_cookie('softType');
if (page == 0) page = bt.get_cookie('p' + type);
if (type == '11'){
soft.get_dep_list(1);
commonly_software.hide();
return;
}
soft.is_install = false;
bt.soft.get_soft_list(page, type, search, function(rdata) {
_this.trail = rdata.trail
// if (rdata.pro < 0) {
// // $("#updata_pro_info").html('');
// } else
// if (rdata.pro === -2) {
// $("#updata_pro_info").html('<div class="alert alert-success" style="margin-bottom:15px"><strong>' + lan.soft.pro_expire + '</strong><button class="btn btn-success btn-xs va0 updata_pro" onclick="bt.soft.updata_pro()" title="' + lan.soft.renew_pro + '" style="margin-left:8px">' + lan.soft.renew_now + '</button>');
// } else if (rdata.pro === -1) {
// $("#updata_pro_info").html('<div class="alert alert-success" style="margin-bottom:15px"><strong > ' + lan.soft.upgrade_pro + '</strong><button class="btn btn-success btn-xs va0 updata_pro" onclick="bt.soft.updata_pro()" title="' + lan.soft.upgrade_pro_now + '" style="margin-left:8px">' + lan.soft.upgrade_now + '</button>\</div>');
// }
soft.set_soft_tips(rdata,type);
// if (type == 10) {
// $("#updata_pro_info").html('<div class="alert alert-danger" style="margin-bottom:15px"><strong>' + lan.soft.bt_developer + '</strong><a class="btn btn-success btn-xs va0" href="https://www.yakpanel.com" title="' + lan.soft.get_third_party_apps + '" style="margin-left: 8px" target="_blank">' + lan.soft.get_third_party_apps + '</a><input type="file" style="display:none;" accept=".zip,.tar.gz" id="update_zip" multiple="multiple"><button class="btn btn-success btn-xs" onclick="soft.update_zip_open()" style="margin-left:8px">' + lan.soft.import_plug + '</button></div>')
// } else if (type == 11) {
// $("#updata_pro_info").html('<div class="alert alert-info" style="margin-bottom:15px"><strong>' + lan.soft.comingsoon + '</strong></div>')
// }
var tBody = '';
rdata.type.unshift({icon: 'icon',id: 0,ps: lan.soft.all,sort: 1,title: lan.soft.all}, {icon: 'icon',id: -1,ps: 'Installed',sort: 1,title: 'Installed'})
for (var i = 0; i < rdata.type.length; i++) {
var c = '';
if (istype == rdata.type[i].id) {
c = 'class="on"';
}
// 注释软件管理的付费插件,第三方插件,一键部署
// if (rdata.type[i].id != "11" && rdata.type[i].id != "10" && rdata.type[i].id != "8") {
if (rdata.type[i].id != "11") {
tBody += '<span typeid="' + rdata.type[i].id + '" ' + c + '>' + rdata.type[i].title + '</span>';
}
}
if (page) bt.set_cookie('p' + type, page);
$(".softtype").html(tBody);
$(".menu-sub span").click(function() {
var _type = $(this).attr('typeid');
bt.set_cookie('softType', _type);
$(this).addClass("on").siblings().removeClass("on");
if (_type !== '11') {
soft.get_list(0, _type);
commonly_software.show();
} else {
soft.get_dep_list(0);
commonly_software.hide();
}
})
var data = rdata.list.data;
$('#softPage').html(rdata.list.page);
if(data.length>0){
for(var i = 0; i < data.length; i++){
if(data[i].task =='-1'){
soft.is_setup = true;
soft.is_setup_name = data[i].name;
break;
}else{
soft.is_setup = false;
soft.is_install = false;
soft.is_setup_name = "";
}
}
}
if(soft.is_setup==true&&soft.is_setup_name != ""){
_this.soft_setup_find();
}
if(soft.refresh_data.length==0){
_this.refresh_table(page, type, search, rdata);
soft.refresh_data = data;
}else
if(JSON.stringify(data) !=JSON.stringify(soft.refresh_data)){
_this.refresh_table(page, type, search, rdata);
soft.refresh_data = data;
}
bt.set_cookie('load_page', (page+'').split('not_load')[0])
bt.set_cookie('load_type', type)
bt.set_cookie('load_search', search)
if (soft.is_install&& soft.is_setup==false) {
setTimeout(function () {
soft.get_list(bt.get_cookie('load_page') + 'not_load', bt.get_cookie('load_type'), bt.get_cookie('load_search'));
}, 3000);
soft.is_install = false;
}
// if(rdata.recommend){
// _this.render_promote_list(rdata.recommend);
// }
})
},
// 查找正在安装软件的状态
soft_setup_find:function(){
var _this = this;
if(soft.is_setup==true&&soft.is_setup_name != ""){
$.post("plugin?action=get_soft_find",{sName:soft.is_setup_name},function(rdata){
if(rdata.task=="-1"){
setTimeout(function () {
_this.soft_setup_find();
}, 3000);
}else{
soft.is_install=true;
setTimeout(function () {
soft.get_list(bt.get_cookie('load_page') + 'not_load', bt.get_cookie('load_type'), bt.get_cookie('load_search'));
}, 3000);
}
});
}
},
// 刷新列表
refresh_table:function(page, type, search, rdata){
var _this = this;
var phps = ['php-5.2', 'php-5.3', 'php-5.4'];
var data = rdata.list.data;
var _tab = bt.render({
table: '#softList',
columns: [{
field: 'title',
title: lan.soft.app_name,
width: 165,
templet: function(item) {
var fName = item.name,
version = item.version;
if (bt.contains(item.name, 'php-')) {
fName = 'php';
version = '';
}
var click_opt = ' ',
sStyle = '';
if (item.setup) {
sStyle = ' style="cursor:pointer"';
if (item.admin) {
if (item.endtime >= 0 || item.price == 0) {
click_opt += 'onclick="bt.soft.set_lib_config(\'' + item.name + '\',\'' + item.title + '\')" ';
}
} else {
click_opt += ' onclick="soft.set_soft_config(\'' + item.name + '\')" ';
}
}
var is_php5 = item.name.indexOf('php-5') >= 0,
webcache = bt.get_cookie('serverType') == 'openlitespeed' ? true : false,
distribution = bt.get_cookie('distribution');
if (webcache) {
switch (distribution) {
case 'centos8':
if (is_php5 || item.name == 'php-7.0') {
click_opt = ' title="' + lan.soft.ap2_2_not_support + '"';
}
break;
case 'centos7':
if (item.name == 'php-5.2') {
click_opt = ' title="' + lan.soft.ap2_2_not_support + '"';
}
break;
default:
if (is_php5) {
click_opt = ' title="' + lan.soft.ap2_2_not_support + '"';
}
break;
}
}else if (rdata.apache22 && item.name.indexOf('php-') >= 0 && $.inArray(item.name, phps) == -1){
click_opt = ' title="' + lan.soft.ap2_2_not_support + '"';
}
//if (rdata.apache22 && item.name.indexOf('php-') >= 0 && $.inArray(item.name, phps) == -1) click_opt = ' title="' + lan.soft.ap2_2_not_support + '"';
return '<span ' + click_opt + ' ' + sStyle + ' ><img src="/static/img/soft_ico/ico-' + fName + '.png">' + item.title + ' ' + version + '</span>';
}
},
{
field: 'price',
title: 'Developer',
width: 110,
templet: function(item) {
if (!item.author) return 'official'
return item.author;
}
},
{
field: 'ps',
title: lan.soft.instructions,
templet: function(item) {
var ps = item.ps;
var is_php = item.name.indexOf('php-') >= 0;
if (is_php && item.setup) {
if (rdata.apache22 && $.inArray(item.name, phps) >= 0) {
if (item.fpm) {
ps += " <span style='color:red;'>(" + lan.soft.apache22 + ")</span>";
}
} else if (!rdata.apache22) {
if (!item.fpm) {
ps += " <span style='color:red;'>(" + lan.soft.apache24 + ")</span>";
}
}
}
return '<span>' + ps + '</span>';
}
},
{
field: 'price',
title: lan.soft.price,
width: 92,
templet: function(item) {
var price = lan.soft.free;
if (item.price > 0) {
price = '<span style="color:#fc6d26">$' + item.price + '</span>';
}
return price;
}
},
(type == 10 ? {
field: 'sort',
width: 80,
title: 'Rated',
templet: function(item) {
return item.sort !== undefined ? ('<a href="javascript:;" onclick="score.open_score_view(' + item.pid + ',\'' + item.title + '\',' + item.count + ')" class="btlink open_sort_view">' + (item.sort <= 0 || item.sort > 5 ? lan.soft.not_rated : item.sort.toFixed(1)) + '</a>') : '--';
}
} : ''),
{
field: 'endtime',
width: 120,
title: lan.soft.expire_time,
templet: function(item) {
var endtime = '--';
if (item.pid > 0) {
if (item.endtime > 0) {
if (item.type != 10) {
endtime = bt.format_data(item.endtime, 'yyyy/MM/dd') ;
} else {
endtime = bt.format_data(item.endtime, 'yyyy/MM/dd') ;
}
} else if (item.endtime === 0) {
endtime = lan.soft.permanent;
} else if (item.endtime === -1) {
endtime = lan.soft.not_open;
} else if (item.endtime === -2) {
if (item.type != 10) {
endtime = lan.soft.already_expire ;
} else {
endtime = lan.soft.already_expire ;
}
}
}
return endtime;
}
},
{
field: 'path',
width: 40,
title: lan.soft.location,
templet: function(item) {
var path = '';
if (item.setup) {
path = '<span class="glyphicon glyphicon-folder-open" onclick="openPath(\'' + item.uninsatll_checks + '\')"></span>';
}
return path;
}
},
(type != 10 ? {
field: 'status',
width: 40,
title: lan.soft.status1,
templet: function(item) {
var status = '';
if (item.setup) {
if (item.status) {
status = '<span style="color:#20a53a" class="glyphicon glyphicon-play"></span>';
} else {
status = '<span style="color:red" class="glyphicon glyphicon-pause"></span>';
}
}
return status;
}
} : ''),
{
field: 'index',
width: 100,
title: lan.soft.display_at_homepage,
templet: function(item) {
var to_index = '';
if (item.setup) {
var checked = '';
if (item.index_display) checked = 'checked';
var item_id = item.name.replace(/\./, "");
to_index = '<div class="index-item"><input class="btswitch btswitch-ios" id="index_' + item_id + '" type="checkbox" ' + checked + '><label class="btswitch-btn" for="index_' + item_id + '" onclick="bt.soft.to_index(\'' + item.name + '\')"></label></div>';
}
return to_index;
}
},
{
field: 'opt',
width: 190,
title: lan.soft.operate,
align: 'right',
templet: function(item) {
var option = '';
var pay_opt = '';
if (item.endtime < 0 && item.pid > 0) {
var re_msg = '';
var re_status = 0;
var buy_type = 0;
switch (item.endtime) {
case -1:
re_msg = lan.soft.buy_now;
buy_type = 31;
break;
case -2:
re_msg = lan.soft.renew_now;
re_status = 1;
buy_type = 32;
break;
}
if (item.type != 10) {
pay_opt = '<a class="btlink" onclick=\'bt.soft.product_pay_view('+ JSON.stringify({
name:item.title,
pid:item.pid,
type:item.type,
plugin:true,
renew:item.endtime,
totalNum:buy_type,
ps: item.ps
}) +')\'>' + re_msg + '</a>';
} else {
pay_opt = '<a class="btlink" onclick="bt.soft.re_plugin_pay_other(\'' + item.title + '\',\'' + item.pid + '\',' + re_status + ',' + item.price + ')">' + re_msg + '</a>';
}
}
var is_php = item.name.indexOf('php-') >= 0,
is_php5 = item.name.indexOf('php-5') >= 0,
webcache = bt.get_cookie('serverType') == 'openlitespeed' ? true : false,
distribution = bt.get_cookie('distribution');
if (webcache && is_php) {
if ((is_php5 || item.name == 'php-7.0') && distribution=='centos8') {
option = '<span title="\' + lan.soft.ap2_2_not_support + \'">' + lan.soft.not_comp + '</span>';
}else if (distribution=='centos7'&&item.name == 'php-5.2') {
option = '<span title="\' + lan.soft.ap2_2_not_support + \'">' + lan.soft.not_comp + '</span>';
}else{
if (distribution!='centos7'&&is_php5) {
option = '<span title="\' + lan.soft.ap2_2_not_support + \'">' + lan.soft.not_comp + '</span>';
} else {
if (item.setup && item.task == '1') {
if (pay_opt == '') {
if (item.versions.length > 1) {
for (var i = 0; i < item.versions.length; i++) {
var min_version = item.versions[i]
var ret = bt.check_version(item.version, min_version.m_version + '.' + min_version.version);
if (ret > 0) {
if (ret == 2) option += '<a class="btlink" onclick="bt.soft.update_soft(\'' + item.name + '\',\'' + item.title + '\',\'' + min_version.m_version + '\',\'' + min_version.version + '\',\'' + min_version.update_msg.replace(/\n/g, "_bt_") + '\')" >' + lan.soft.update + '</a> | ';
break;
}
}
} else {
var min_version = item.versions[0];
var cloud_version = min_version.m_version + '.' + min_version.version;
if (item.version != cloud_version) option += '<a class="btlink" onclick="bt.soft.update_soft(\'' + item.name + '\',\'' + item.title + '\',\'' + min_version.m_version + '\',\'' + min_version.version + '\',\'' + min_version.update_msg.replace(/\n/g, "_bt_") + '\')" >' + lan.soft.update + '</a> | ';
}
if (item.admin) {
option += '<a class="btlink" onclick="bt.soft.set_lib_config(\'' + item.name + '\',\'' + item.title + '\')">' + lan.soft.setup + '</a> | ';
} else {
option += '<a class="btlink" onclick="soft.set_soft_config(\'' + item.name + '\')">' + lan.soft.setup + '</a> | ';
}
} else {
option = pay_opt + ' | ' + option;
}
option += '<a class="btlink" onclick="bt.soft.un_install(\'' + item.name + '\')" >' + lan.soft.uninstall + '</a>';
} else if (item.task == '-1') {
option = '<a class="btlink" onclick="messagebox()" >' + lan.soft.installing + '</a>';
soft.is_install = true;
} else if (item.task == '0') {
option = '<a class="btlink" onclick="messagebox()" >' + lan.soft.wait_install + '</a>';
soft.is_install = true;
} else if (item.task == '-2') {
option = '<a class="btlink" onclick="messagebox()" >Updating</a>';
soft.is_install = true;
} else {
if (pay_opt) {
option = pay_opt;
} else {
option = '<a class="btlink" onclick="bt.soft.install(\'' + item.name + '\')" >' + lan.soft.install + '</a>';
}
}
}
}
}else {
if (rdata.apache22 && is_php && $.inArray(item.name, phps) == -1) {
if (item.setup) {
option = '<a class="btlink" onclick="bt.soft.un_install(\'' + item.name + '\')" >' + lan.soft.uninstall + '</a>';
} else {
option = '<span title="\' + lan.soft.ap2_2_not_support + \'">' + lan.soft.not_comp + '</span>';
}
} else if (rdata.apache24 && item.name == 'php-5.2') {
if (item.setup) {
option = '<a class="btlink" onclick="bt.soft.un_install(\'' + item.name + '\')" >' + lan.soft.uninstall + '</a>';
} else {
option = '<span title="\' + lan.soft.ap2_2_not_support + \'">' + lan.soft.not_comp + '</span>';
}
} else {
if (item.setup && item.task == '1') {
if (pay_opt == '') {
if (item.versions.length > 1) {
for (var i = 0; i < item.versions.length; i++) {
var min_version = item.versions[i]
var ret = bt.check_version(item.version, min_version.m_version + '.' + min_version.version);
if (ret > 0) {
if (ret == 2) option += '<a class="btlink" onclick="bt.soft.update_soft(\'' + item.name + '\',\'' + item.title + '\',\'' + min_version.m_version + '\',\'' + min_version.version + '\',\'' + min_version.update_msg.replace(/\n/g, "_bt_") + '\')" >' + lan.soft.update + '</a> | ';
break;
}
}
} else {
var min_version = item.versions[0];
var cloud_version = min_version.m_version + '.' + min_version.version;
if (item.version != cloud_version) option += '<a class="btlink" onclick="bt.soft.update_soft(\'' + item.name + '\',\'' + item.title + '\',\'' + min_version.m_version + '\',\'' + min_version.version + '\',\'' + min_version.update_msg.replace(/\n/g, "_bt_") + '\')" >' + lan.soft.update + '</a> | ';
}
if (item.admin) {
option += '<a class="btlink" onclick="bt.soft.set_lib_config(\'' + item.name + '\',\'' + item.title + '\')">' + lan.soft.setup + '</a> | ';
} else {
option += '<a class="btlink" onclick="soft.set_soft_config(\'' + item.name + '\')">' + lan.soft.setup + '</a> | ';
}
} else {
option = pay_opt + ' | ' + option;
}
option += '<a class="btlink" onclick="bt.soft.un_install(\'' + item.name + '\')" >' + lan.soft.uninstall + '</a>';
} else if (item.task == '-1') {
option = '<a class="btlink" onclick="messagebox()" >' + lan.soft.installing + '</a>';
soft.is_install = true;
} else if (item.task == '0') {
option = '<a class="btlink" onclick="messagebox()" >' + lan.soft.wait_install + '</a>';
soft.is_install = true;
} else if (item.task == '-2') {
option = '<a class="btlink" onclick="messagebox()" >Updating</a>';
soft.is_install = true;
} else {
if (pay_opt) {
option = pay_opt;
} else {
option = '<a class="btlink" onclick="bt.soft.install(\'' + item.name + '\')" >' + lan.soft.install + '</a>';
}
}
}
}
return option;
}
}
],
data: data,
empty:'<a class="btlink" onClick="javascript:bt.openFeedback({title:\'YakPanel demand feedback collection\',placeholder:\'<span>If you encounter any problems or imperfect functions during use, please describe <br> your problems or needs to us in detail, we will try our best to solve or improve for <br> you</span>\',recover:\'We pay special attention to your requirements feedback, and we conduct regular weekly requirements reviews. I hope I can help you better\',key:993,proType:2});" style="margin-left: 10px;display:block;margin:10px 10px;white-space: nowrap;">If the search content is not found, submit the demand feedback</a>'
})
// 需求反馈
if(data.length == 0){
$('.feedback-btn').remove();
$('.soft-filter-box .soft-search').after('<span style="display:inline-block; margin-left:10px;margin-top:8px;vertical-align: bottom;" class="feedback-btn"><span class="flex" style="align-items: center;margin-right:16px;width:100px;"><i class="icon-demand"></i><a class="btlink" onClick="javascript:bt.openFeedback({title:\'YakPanel demand feedback collection\',placeholder:\'<span>If you encounter any problems or imperfect functions during use, please describe <br> your problems or needs to us in detail, we will try our best to solve or improve for <br> you</span>\',recover:\'We pay special attention to your requirements feedback, and we conduct regular weekly requirements reviews. I hope I can help you better\',key:993,proType:2});" style="margin-left: 10px;">Feedback</a></span></span>');
}
},
// 渲染列表
render_promote_list:function(data){
if($('#soft_recom_list').length > 0) $('#soft_recom_list').remove();
var html = $('<ul id="soft_recom_list" class="recom_list"></ul>'),that = this;
for(var i=0;i< data.length;i++){
var type = '', item = data[i];
(function(item){
switch (item.type) {
case 'link': // 链接推荐
type = $('<a href="'+ item.data +'" target="_blank" title="'+ (item.title || '') +'"><span>'+ (item.title || '') +'</span></a>');
break;
case 'soft': // 软件推荐
case 'other': // 第三方推荐
case 'onekey': // 一键部署推荐
type = $('<a href="javascript:;" class="btlink" title="'+ (item.title || '') +'"><span>'+ (item.title || '') +'</span></a>').click(function(){
that.render_promote_view(item);
});
break;
}
html.append($('<li></li>').append(type));
}(item))
// html.append($('<li><img src="'+ item.image +'"></li>').append(type));
}
$('#updata_pro_info').before(html);
},
// 渲染软件列表
render_promote_view:function(find){
var that = this,is_single_product = find.data.length > 1,find_data = find.data;
if(is_single_product){
layer.open({
title:find.title,
area:'800px',
btn:false,
closeBtn:2,
shadeClose:false,
content: (function(){
var html = '';
for(var i=0;i<find_data.length;i++){
var item = find_data[i],thtml = '';
if(!item.setup){
thtml = '<button type="button" class="btn btn-success btn-xs" onclick="bt.soft.install(\''+ item.name +'\',this)">Install</button>';
}else{
if(item.pid != 0){
if(item.endtime == 0){ //永久
thtml = '<button type="button" class="btn btn-success btn-xs" onclick="bt.soft.set_lib_config(\''+ item.name +'\',\''+ item.title +'\')">Setting</button>';
}else if(item.endtime > 0){ //已购买
thtml = '<button type="button" class="btn btn-success btn-xs" onclick="bt.soft.set_lib_config(\''+ item.name +'\',\''+ item.title +'\')">Setting</button>';
}else if(item.endtime == -1){ //未购买
thtml = '<button type="button" class="btn btn-success btn-xs" onclick=\'bt.soft.product_pay_view('+ JSON.stringify({name:item.title,pid:item.pid,type:item.type,pulgin:true,renew:item.endtime}) +');\'>Upgrade now</button>';
}else if(item.endtime == -2){ //已过期
thtml = '<button type="button" class="btn btn-success btn-xs" onclick=\'bt.soft.product_pay_view('+ JSON.stringify({name:item.title,pid:item.pid,type:item.type,pulgin:true,renew:item.endtime}) +');\'>立即续费</button>';
}
}else{
thtml = '<button type="button" class="btn btn-success btn-xs" onclick="bt.soft.set_lib_config(\''+ item.name +'\',\''+ item.title +'\')">Setting</button>';
}
}
html += '<div class="recom_item_box">' +
'<div class="recom_item_left">' +
'<div class="recom_item_images"><img src="/static/img/'+(find.type == 'onekey'?'dep_ico':'soft_ico')+'/ico-'+ item.name +'.png" /></div>' +
'<div class="recom_item_pay"><a href="javascript:;" class="btlink" style="color:'+(item.setup?'#20a53a':'#666')+'">'+ (item.setup?'Installed':'Not installed') +'</a></div>'+
'</div>' +
'<div class="recom_item_right">' +
'<div class="recom_item_title">' +
'<div class="recom_item_text">'+ item.title + '&nbsp;v'+ item.version +'</div>' +
'<div class="recom_item_price">$<span>'+ item.price +'</span>/month</div>' +
'</div>' +
'<div class="recom_item_info" title="'+ item.ps +'">'+ item.ps +'</div>'+
'<div class="recom_item_btn">'+ thtml +'</div>'+
'</div>' +
'</div>'
}
return html;
})(),
});
}
},
set_soft_tips:function(rdata,type){
var tips_info = $('<div class="alert" style="margin-bottom:15px"><div class="soft_tips_text"></div><div class="btn-ground" style="display:inline-block;"></div></div>'),
explain = tips_info.find('.soft_tips_text'),
btn_ground = tips_info.find('.btn-ground'),
_this = this,
el = '#updata_pro_info';
$(el).empty()
type = parseInt(type);
if(type != 11) $(el).next('.onekey-menu-sub').remove();
if(type == 10){
$(el).css('display','block')
explain.text('Security Reminder: YakPanel officially conducted a security audit before the third-party plug-in was put on the shelves, but there may be security risks. Please check it out before using it in the production environment.');
btn_ground = soft.render_tips_btn(btn_ground,[
//{title:'免费入驻',href:'https://www.yakpanel.com/developer/',rel:'noreferrer noopener',target:'_blank',btn:'免费入驻',class:'btn btn-success btn-xs va0',style:"margin-left:10px;"},
{title:'Get third-party apps',rel:'noreferrer noopener',href:'https://www.yakpanel.com/bbs/forum-40-1.html',target:'_blank',btn:'Get third-party apps',class:'btn btn-success btn-xs va0 ml15',style:"margin-left:10px;"},
{title:'Import plugins',href:'javascript:;',btn:'Import plugins','class':'btn btn-success btn-xs va0 ml15','style':"margin-left:10px;",click:function(e){
var input = $('<input type="file" style="display:none;" accept=".zip,.tar.gz" id="update_zip" multiple="multiple">').change(function (e) {
var files =$(this)[0].files;
if (files.length == 0) return;
soft.update_zip(files[0]);
}).click();
}}
]);
$(el).append(tips_info.addClass('alert-danger'));
}else if(type == 11){
explain.text('YakPanel 一键部署已上线,诚邀全球优秀项目入驻(限项目官方) ');
btn_ground = soft.render_tips_btn(btn_ground,[
{title:'免费入驻',href:'https://www.yakpanel.com/bbs/thread-33063-1-1.html',rel:'noreferrer noopener',target:'_blank',btn:'免费入驻',class:'btn btn-success btn-xs va0',style:"margin-left:10px;"},
{title:'导入项目',href:'javascript:;',rel:'noreferrer noopener',btn:'导入项目',class:'btn btn-success btn-xs va0',style:"margin-left:10px;",click:soft.input_package}
]);
$(el).append(tips_info.addClass('alert-info'));
}else{
var genre = true,
is_buy = false
if (rdata.ltd > 0 || type === 12) {
genre = false
} else if (rdata.pro >= 0 || type === 8) {
genre = true
}
if (rdata.ltd > 0 || rdata.pro >= 0) is_buy = true
if (type === 12 && rdata.ltd < 0) is_buy = false
var buy_type = is_buy?30:29
var ltd = parseInt(bt.get_cookie('ltd_end') || -1),pro = parseInt(bt.get_cookie('pro_end') || -1),todayDate = parseInt(new Date().getTime()/1000),_ltd = null;
if((ltd > 0 && (ltd == pro || pro < 0)) || (ltd < 0 && pro >= 0) || (ltd > 0 && pro >= 0)){
_ltd = ((ltd > 0 && (ltd == pro || pro < 0)) || (ltd > 0 && pro >= 0))?1:0;
explain.html('The '+ (_ltd?'Pro':'Pro') +' edition can use the '+ (_ltd?'专业版及企业版插件':'professional plug-in for free,') + (!(pro == 0 && ltd < 0)?('expiration time: '+ (bt.format_data((_ltd?ltd:pro),'yyyy/MM/dd') ) +''+((((_ltd?ltd:pro) - todayDate) <= 15*24*60*60)?('<span style="color:red">Only '+ Math.round(((_ltd?ltd:pro) - todayDate) / (24*60*60)) +' days until expiration</span>'):'')):',过期时间:<span style="color: #fc6d26;font-weight: bold;">永久授权</span>'));
}else if(ltd == -1 && pro == -1){
explain.html('Upgrade to Pro edition, all plugins, free to use!');
}else if(pro == 0 && ltd < 0){
_ltd = 2;
explain.html('The Pro edition can use the professional plug-in for free, expiration time: 永久授权。'+(type == 12?'&nbsp;&nbsp;<span style="color:#af8e48">升级企业版,企业可以免费试用企业版插件及专业版插件。</span>':''));
if(type == 12){
btn_ground = soft.render_tips_btn(btn_ground,{title:'立即升级',href:'javascript:;',btn:'立即升级','class':'btn btn-success btn-xs va0 ml15','style':"margin-left:10px;",click:bt.soft.updata_ltd});
}
}else if(ltd == -2 || pro == -2){
_ltd = (ltd == -2)?1:0;
explain.html('当前为'+ (_ltd?'企业版':'专业版') +''+ (_ltd?'企业版':'专业版') +'可以免费使用'+ (_ltd?'专业版及企业版插件':'专业版插件') +'<span style="color:red">'+ (_ltd?'企业版':'专业版') +'已过期</span>');
}
var btn_config = {title:null,href:'javascript:;',btn:null,'class':'btn btn-success btn-xs va0 ml15','style':"margin-left:10px;",click:null};
var set_btn_style = function(res){
if(!res.status || !res){
fun = function(){
bt.pub.bind_btname(function(){
window.location.reload();
});
}
$.extend(btn_config,{title:'Login',btn:'Login',click:fun});
}else{
if(type == 12 && (ltd < 0 && pro >=0)){
explain.html('企业版可以免费使用专业版及企业版插件,了解专业版和企业版的区别,请点击<a href="https://www.yakpanel.com/download/linux.html" target="_blank" class="btlink ml5">查看详情</a>。<a href="https://www.yakpanel.com/bbs/forum.php?mod=viewthread&tid=50342&page=1&extra=#pid179211" target="_blank" class="btlink ml5">《专业版升级企业版教程》</a>');
$(el).append(tips_info.addClass('alert-ltd-success'));
return false;
}else{
var btn = $('<a title="' + (is_buy ? 'Renew Now' : 'Upgrade now') + '" href="javascript:;" class="btn btn-success btn-xs va0 ml15" style="margin-left:10px;">' + (is_buy ? 'Renew Now' : 'Upgrade now') + '</a>')
btn.on('click', function () {
genre ? bt.soft.updata_pro(buy_type) : bt.soft.updata_ltd(undefined,buy_type)
})
tips_info.addClass('showprofun').find('.btn-ground').append(btn)
}
}
// if(_ltd != 2){
// if(!(pro == 0 && ltd < 0)){
// btn_ground = soft.render_tips_btn(btn_ground);
// }
// }
$(el).append(tips_info.addClass(_ltd == 1?'alert-ltd-success':'alert-success'));
if(_this.trail){
setTimeout(function (){
$('.btn-ground').after('<span class="pro_trail" style="font-weight: 700;margin-left:25px;">Try the Pro edition for free</span>')
var trail = $('<a href="javascript:;" class="btn btn-success btn-xs va0 ml15" style="margin-left:10px;">Click to try</a>');
trail.click((!res.status || !res)?fun:function(){
var loadT = bt.load()
bt.confirm({
title:"Pro Edition",
msg:"Get 7-day Pro edition free, get it now?"
},function (){
bt.send('free_trial','auth/free_trial',{},function(res){
loadT.close()
bt.msg(res)
setTimeout(function () { window.location.reload() },2000)
})
})
})
$('.pro_trail').after(trail)
},100)
}
}
var bt_user_info = bt.get_cookie('bt_user_info');
if(!bt_user_info){
bt.pub.get_user_info(function(res){
if(!res.status){
set_btn_style(false);
return false;
}
bt.set_cookie('bt_user_info',JSON.stringify(res),300000);
set_btn_style(res);
});
}else{
set_btn_style(JSON.parse(bt.get_cookie('bt_user_info')));
}
}
},
/**
* @description 设置软件信息
* @param {object} rdata 软件列表请求数据
* @param {string} type 列表类型
*/
render_soft_recommend: function () {
bt.send('get_usually_plugin', 'plugin/get_usually_plugin', {}, function (res) {
var html = '';
for (var i = 0; i < res.length; i++) {
var item = res[i];
html += '<div class="item" title="open' + item.title + '" onclick="bt.soft.set_lib_config(\'' + item.name + '\',\'' + item.title + '\',\'' + item.version + '\')"><img src="/static/img/soft_ico/ico-' + item.name + '.png"><span>' + item.title + '</span></div>'
}
$('#commonly_software .commonly_software_list').html(html)
})
},
render_tips_btn:function(node,arry){
if(!Array.isArray(arry)) arry = [arry]
for(var i=0;i<arry.length;i++){
var item = arry[i], btn = '<a ';
for(var key in item){ if(key != 'click' && key != 'btn') btn += item[key]?(key+'="'+item[key]+'" '):'' }
btn += '>'+item['btn'] +'</a>';
if(item.click){
btn = $(btn).on('click',item.click)
}
node.append(btn);
}
return node
},
get_dep_list: function(p) {
var loadT = layer.msg('Getting list <img src="/static/img/ing.gif">', {
icon: 16,
time: 0,
shade: [0.3, '#000']
});
var pdata = {}
var search = $("#SearchValue").val();
if (search != '') {
pdata['search'] = search
}
var type = '';
var istype = getCookie('depType');
if (istype == 'undefined' || istype == 'null' || !istype) {
istype = '0';
}
pdata['type'] = istype;
var force = bt.get_cookie('force');
if (force === '1') {
pdata['force'] = force;
}
bt.set_cookie('force', 0);
$.post('/deployment?action=GetList', pdata, function(rdata) {
layer.close(loadT)
var tBody = '';
soft.set_soft_tips(rdata, 11);
rdata.type.unshift({
icon: 'icon',
id: 0,
ps: 'All',
sort: 1,
title: 'All'
}, {
icon: 'icon',
id: -1,
ps: 'Installed',
sort: 1,
title: 'Installed'
});
for (var i = 0; i < rdata.type.length; i++) {
var c = '';
if ('11' == rdata.type[i].id) {
c = 'class="on"';
}
tBody += '<span typeid="' + rdata.type[i].id + '" ' + c + '>' + rdata.type[i].title + '</span>';
}
$(".softtype").html(tBody);
$(".menu-sub span").click(function() {
var _type = $(this).attr('typeid');
bt.set_cookie('softType', _type);
$(this).addClass("on").siblings().removeClass("on");
if (_type !== '11') {
soft.get_list(0, _type);
} else {
soft.get_dep_list(1);
}
});
if ($(".onekey-type").attr("class") === undefined) {
tbody = '<div class="alert alert-info" style="margin-bottom: 10px;">\
<strong class="mr5">YakPanel one-click deployment has been launched, and we invite global outstanding projects to settle in (limited to project officials)</strong>\
<a class="btn btn-success btn-xs mr5" href="https://www.yakpanel.com/bbs/thread-33063-1-1.html" target="_blank">Free entry</a>\
<a class="btn btn-success btn-xs" onclick="soft.input_package()">Import project</a>\
</div><div class="onekey-menu-sub onekey-type" style="margin-bottom:15px">';
rdata.dep_type.unshift({
tid: 0,
title: 'All'
})
rdata.dep_type.push({
tid: 100,
title: 'Other'
})
for (var i = 0; i < rdata.dep_type.length; i++) {
var c = '';
if (istype == rdata.dep_type[i].tid) {
c = 'class="on"';
}
tbody += '<span typeid="' + rdata.dep_type[i].tid + '" ' + c + '>' + rdata.dep_type[i].title + '</span>';
}
tbody += "</div>";
$("#updata_pro_info").html(tbody);
$(".onekey-menu-sub span").click(function() {
setCookie('depType', $(this).attr('typeid'));
$(this).addClass("on").siblings().removeClass("on");
soft.get_dep_list(1);
});
}
var zbody = '<thead>\
<tr>\
<th>Name</th>\
<th>Version</th>\
<th>Introduction</th>\
<th>Support for PHP version</th>\
<th>Provider</th>\
<th>Score</th>\
<th style="text-align: right;" width="80">Operate</th>\
</tr>\
</thead>';
var icon_other = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYFJREFUeNpi/P//P8NAAhZkzrVr1zyB1FwglqSiHSZAfBZZQEtLC7sDQJZLSUlJcnNzU8Xm27dvg6jVQByqqqp6FpsaJjS+JCcnJ8O/f/+ogkFATk5uJ8gRQMcYE+MAqgN2dvYMeXn5g0DmGmyOYKJHQmNjY0tQUFA4gc0RLLS0mI+PD5YOQCACSp8BYka6OEBUVJRBXFwcW8IkPgQ+r2lk+PPsJnl5XEqdgTeknvhyABsAWS6Ytwyr3PtJUTjlYPKEAEWJEGQ5MZbQzAGEQoDmDhgNAWITGk0dQCkYcAewUJoIh38IgIpTchMai6Qa5Q4gVJYP+SgYcAcwIjfLHxZo0qWNLj/hOp4GCQs7bo0121D4D1u8wGIwGlkcd/3+k/xyANlgdMcgy8McRbM0QIoFVC8J8VkOCxVSHMdCTZ+TEyooDvjPKfCP8ddXJgZGJqISIskW/v8HtIP/H85seGdWYT3L/eN1jN8/0qR8+M8l8PePgkWzSlp/I1YHDAQACDAAtKS/DHmsv9AAAAAASUVORK5CYII='
for (var i = 0; i < rdata.list.length; i++) {
var remove_opt = '';
if (rdata.list[i].id === 0) {
remove_opt = ' | <a class="btlink" onclick="soft.update_package(\'' + rdata.list[i].name + '\')">' + lan.public.update + '</a> | <a class="btlink" onclick="soft.remove_other_dep(\'' + rdata.list[i].name + '\')">' + lan.public.del + '</a>';
rdata.list[i].min_image = icon_other
} else {
rdata.list[i].min_image += '?t=' + new Date().format("yyyyMMdd");
}
zbody += '<tr>' +
'<td><img src="' + rdata.list[i].min_image + '">' + rdata.list[i].title + '</td>' +
'<td>' + rdata.list[i].version + '</td>' +
'<td>' + rdata.list[i].ps + '</td>' +
'<td>' + rdata.list[i].php + '</td>' +
'<td><a class="btlink" target="_blank" href="' + rdata.list[i].official + '">' + (rdata.list[i].author == 'YakPanel' ? rdata.list[i].title : rdata.list[i].author) + '</a></td>' +
'<td>' + (rdata.list[i].sort !== undefined ? ('<a href="javascript:;" class="btlink open_score_view" onclick="score.open_score_view(' + rdata.list[i].id + ',\'' + rdata.list[i].title + '\',' + rdata.list[i].count + ')" >' + (rdata.list[i].sort <= 0 || rdata.list[i].sort > 5 ? 'No rating' : rdata.list[i].sort.toFixed(1)) + '</a>') : '--') +
'</td>' +
'<td class="text-right"><a href="javascript:onekeyCodeSite(\'' + rdata.list[i].name + '\',\'' + rdata.list[i].php + '\',\'' + rdata.list[i].title + '\',\'' + rdata.list[i].enable_functions + '\');" class="btlink">One-Click</a>' + remove_opt + '</td>' +
'</tr>'
}
$("#softList").html(zbody);
$("#softPage").html('');
$(".searchInput").val('');
});
},
remove_other_dep: function(name) {
bt.show_confirm(lan.soft.del_custom_item, lan.soft.confirm_del.replace('{1}', name), function() {
var loadT = layer.msg(lan.soft.deleting, {
icon: 16,
time: 0,
shade: 0.3
});
$.post('/deployment?action=DelPackage', {
dname: name
}, function(rdata) {
layer.close(loadT);
if (rdata.status) soft.get_dep_list();
setTimeout(function() {
layer.msg(rdata.msg, {
icon: rdata.status ? 1 : 2
});
}, 1000);
});
});
},
input_package: function() {
var con = '<form class="bt-form pd20 pb70" id="input_package">\
<div class="line"><span class="tname">Index name</span>\
<div class="info-r c9"><input class="bt-input-text" type="text" value="" name="name" placeholder="Project index name" style="width:190px" />\
<span>Format: [0-9A-Za-z_-]+, Do not have spaces and special characters</span>\
</div>\
</div>\
<div class="line"><span class="tname">Name</span>\
<div class="info-r c9"><input class="bt-input-text" name="title" placeholder="Project name" style="width:190px" type="text">\
<span>The name used to display to the list</span>\
</div>\
</div>\
<div class="line"><span class="tname">PHP Version</span>\
<input class="bt-input-text mr5 " name="php" placeholder="e.g.53,54,55,56,70,71,72" style="width:190px" value="" type="text" />\
<span class="c9">Please use multiple "," (comma) to separate, do not use PHP5.2</span>\
</div>\
<div class="line"><span class="tname">Unblocked function</span>\
<input class="bt-input-text mr5" name="enable_functions" style="width:190px" placeholder="e.g.system,exec" type="text" />\
<span class="c9">Multiples should be separated by "," (comma), only the necessary functions are unblocked.</span>\
</div>\
<div class="line"><span class="tname">Project version</span>\
<input class="bt-input-text mr5" name="version" style="width:190px" placeholder="e.g.5.2.1" type="text" />\
<span class="c9">Currently imported project version</span>\
</div>\
<div class="line"><span class="tname">Introduction</span>\
<div class="info-r c15"><input class="bt-input-text mr5" name="ps" value="" type="text" style="width:290px" /></div>\
</div>\
<div class="line"><span class="tname">Upload project package</span>\
<input class="bt-input-text mr5" name="dep_zip" type="file" style="width:290px" placeholder="e.g.system,exec" >\
<span class="c9">Please upload the project package in zip format, which must contain the auto_insatll.json configuration file.</span>\
</div>\
<div class="bt-form-submit-btn">\
<button type="button" class="btn btn-danger btn-sm onekeycodeclose" onclick="layer.closeAll()">' + lan.public.cancel + '</button>\
<button type="button" class="btn btn-success btn-sm" onclick="soft.input_package_to()">' + lan.public.submit + '</button>\
</div>\
</from>';
layer.open({
type: 1,
title: "Import a one-click deployment project package",
area: '600px',
closeBtn: 2,
shadeClose: false,
content: con
});
},
update_package: function(p_name) {
$.post('/deployment?action=GetPackageOther', {
p_name: p_name
}, function(rdata) {
var con = '<form class="bt-form pd20 pb70" id="input_package">\
<div class="line"><span class="tname">Index name</span>\
<input class="bt-input-text" type="text" value="' + rdata.name + '" name="name" placeholder="Project index name" style="width:190px" />\
<span class="c9" style="margin-left: 5px;">Format: [0-9A-Za-z_-]+, Do not have spaces and special characters</span>\
</div>\
<div class="line"><span class="tname">Name</span>\
<input class="bt-input-text" name="title" value="' + rdata.title + '" placeholder="Project name" style="width:190px" type="text">\
<span class="c9" style="margin-left: 5px;">The name used to display to the list</span>\
</div>\
<div class="line"><span class="tname">PHP Version</span>\
<input class="bt-input-text mr5 " name="php" placeholder="e.g.53,54,55,56,70,71,72" style="width:190px" value="' + rdata.php + '" type="text" />\
<span class="c9">Please use multiple "," (comma) to separate, do not use PHP5.2</span>\
</div>\
<div class="line"><span class="tname">Unblocked function</span>\
<input class="bt-input-text mr5" name="enable_functions" value="' + rdata.enable_functions + '" style="width:190px" placeholder="e.g.system,exec" type="text" />\
<span class="c9">Multiples should be separated by "," (comma), only the necessary functions are unblocked.</span>\
</div>\
<div class="line"><span class="tname">Project version</span>\
<input class="bt-input-text mr5" name="version" value="' + rdata.version + '" style="width:190px" placeholder="e.g.5.2.1" type="text" />\
<span class="c9">Currently imported project version</span>\
</div>\
<div class="line"><span class="tname">Introduction</span>\
<div class="info-r c15"><input class="bt-input-text mr5" name="ps" value="' + rdata.ps + '" type="text" style="width:290px" /></div>\
</div>\
<div class="line"><span class="tname">Upload project package</span>\
<input class="bt-input-text mr5" name="dep_zip" type="file" style="width:290px" placeholder="e.g.system,exec" >\
<span class="c9">Please upload the project package in zip format, which must contain the auto_insatll.json configuration file.</span>\
</div>\
<div class="bt-form-submit-btn">\
<button type="button" class="btn btn-danger btn-sm onekeycodeclose" onclick="layer.closeAll()">' + lan.public.cancel + '</button>\
<button type="button" class="btn btn-success btn-sm" onclick="soft.input_package_to()">' + lan.public.update + '</button>\
</div>\
</from>';
layer.open({
type: 1,
title: "Update one-click deployment project package",
area: '600px',
closeBtn: 2,
shadeClose: false,
content: con
});
});
},
input_package_to: function() {
var pdata = new FormData($("#input_package")[0]);
if (!pdata.get('name') || !pdata.get('title') || !pdata.get('version') || !pdata.get('php') || !pdata.get('ps')) {
layer.msg('The following are required (Index name / Name / Project version / PHP version / Introduction)', {
icon: 2
});
return;
}
var fs = $("input[name='dep_zip']")[0].files;
if (fs.length < 1) {
layer.msg('Please select the project package file', {
icon: 2
});
return;
}
var f = fs[0]
if (f.type.indexOf('zip') == -1) {
layer.msg('Only supports files in zip format!');
return;
}
if (!pdata.get('dep_zip')) pdata.append('dep_zip', f);
var loadT = layer.msg('Importing...', {
icon: 16,
time: 0,
shade: 0.3
});
$.ajax({
url: "/deployment?action=AddPackage",
type: "POST",
data: pdata,
processData: false,
contentType: false,
success: function(data) {
layer.close(loadT);
if (data.status) {
layer.closeAll();
setCookie('depType', 100)
soft.get_dep_list();
setTimeout(function() {
layer.msg('Successfully imported!');
}, 1000)
}
},
error: function(responseStr) {
layer.msg('Upload failed 2!', {
icon: 2
});
}
});
},
flush_cache: function() {
bt.set_cookie('force', 1);
soft.get_list();
},
get_config_menu: function(name) //获取设置菜单显示
{
var meun = '';
if (bt.os == 'Linux') {
var datas = {
public: [{
type: 'config',
title: lan.soft.config_edit
},
{
type: 'change_version',
title: lan.soft.nginx_version
}
],
openlitespeed: [{
type: 'openliMa_set',
title: 'OpenLiteSpeed'
}],
mysqld: [{
type: 'change_data_path',
title: lan.soft.save_path
},
{
type: 'change_mysql_port',
title: lan.site.port
},
{
type: 'change_mysql_ssl',
title: lan.site.site_menu_7
},
{
type: 'get_mysql_run_status',
title: lan.soft.status
},
{
type: 'get_mysql_status',
title: lan.soft.php_main7
},
{
type: 'mysql_log',
title: lan.soft.log
},
{
type: 'mysql_slow_log',
title: lan.public.slow_log
},
],
phpmyadmin: [{
type: 'phpmyadmin_php',
title: lan.soft.php_version
},
{
type: 'phpmyadmin_safe',
title: lan.soft.safe
}
],
memcached: [{
type: 'memcached_status',
title: lan.soft.php_main8
},
{
type: 'memcached_set',
title: lan.soft.php_main7
},
],
redis: [{
type: 'get_redis_status',
title: lan.soft.php_main8
}, ],
tomcat: [{
type: 'log',
title: lan.soft.run_log
}],
apache: [{
type: 'apache_set',
title: lan.soft.php_main7
},
{
type: 'apache_status',
title: lan.soft.nginx_status
},
{
type: 'apache_format_log',
title: 'Logs format'
},
{
type: 'log',
title: lan.soft.run_log
}
],
nginx: [{
type: 'nginx_set',
title: lan.soft.php_main7
},
{
type: 'nginx_status',
title: lan.soft.nginx_status
},
{
type: 'nginx_format_log',
title: 'Logs format'
},
{
type: 'log',
title: lan.soft.err_log
}
]
};
var arrs = datas.public;
if (name == 'phpmyadmin') arrs = [];
if (name == 'openlitespeed') arrs.length = 1;
if(name === 'pureftpd') arrs.push({type: 'pureftpd_log',title: 'Logs Manage'});
arrs = arrs.concat(datas[name]);
if (arrs) {
for (var i = 0; i < arrs.length; i++) {
var item = arrs[i];
if (item) {
var tit = item.title.length >= 24 ? item.title : '';
meun += '<p onclick="soft.get_tab_contents(\'' + item.type + '\',this)" title="' + tit + '">' + item.title + '</p>';
}
}
}
}
return meun;
},
set_soft_config: function(name) {
//软件设置
var _this = this;
var loading = bt.load();
bt.soft.get_soft_find(name, function(rdata) {
loading.close();
if (name == 'mysql') name = 'mysqld';
var menuing = bt.open({
type: 1,
area: "800px",
title: name + lan.soft.admin,
closeBtn: 2,
shift: 0,
content: '<div class="bt-w-main" style="width:800px;height:650px;"><div class="bt-w-menu bt-soft-menu"></div><div id="webEdit-con" class="bt-w-con pd15" style="height:639px;overflow:auto"><div class="soft-man-con bt-form"></div></div></div>'
});
var menu = $('.bt-soft-menu').data("data", rdata);
setTimeout(function() {
menu.append($('<p class="bgw bt_server" onclick="soft.get_tab_contents(\'service\',this)">' + lan.soft.service + '</p>'))
if (rdata.version_coexist) {
var ver = name.split('-')[1].replace('.', '');
var opt_list = [{
type: 'set_php_config',
val: ver,
title: lan.soft.php_main5
},
{
type: 'config_edit',
val: ver,
title: lan.soft.config_edit
},
{
type: 'set_upload_limit',
val: ver,
title: lan.soft.php_main2
},
{
type: 'set_timeout_limit',
val: ver,
title: lan.soft.php_main3,
php53: true
},
{
type: 'config',
val: ver,
title: lan.soft.php_main4
},
{ type: 'fpm_config',
val: ver,
title: 'FPM profile'
},
{
type: 'set_dis_fun',
val: ver,
title: lan.soft.php_main6
},
{
type: 'set_fpm_config',
val: ver,
title: lan.soft.php_main7,
apache24: true,
php53: true
},
{
type: 'get_php_status',
val: ver,
title: lan.soft.php_main8,
apache24: true,
php53: true
},
{
type: 'get_php_session',
val: ver,
title: lan.soft.php_main9,
apache24: true,
php53: true
},
{
type: 'get_fpm_logs',
val: ver,
title: lan.soft.log,
apache24: true,
php53: true
},
{
type: 'get_slow_logs',
val: ver,
title: lan.public.slow_log,
apache24: true,
php53: true
},
{
type: 'get_phpinfo',
val: ver,
title: 'phpinfo'
}
]
var phpSort = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
webcache = bt.get_cookie('serverType') == 'openlitespeed' ? true : false;
for (var i = 0; i < phpSort.length; i++) {
var item = opt_list[i];
if (item) {
if (item.os == undefined || item['os'] == bt.os) {
if (name.indexOf("5.2") >= 0 && item.php53) continue;
if (webcache && (item.type=='set_fpm_config' || item.type=='get_php_status')) continue;
var apache24 = item.apache24 ? 'class="apache24"' : '';
menu.append($('<p data-id="' + i + '" ' + apache24 + ' onclick="soft.get_tab_contents(\'' + item.type + '\',this)" >' + item.title + '</p>').data('item', item))
}
}
}
} else {
menu.append(soft.get_config_menu(name));
}
$(".bt-w-menu p").click(function() {
$(this).addClass("bgw").siblings().removeClass("bgw");
});
$(".bt-w-menu p:eq(0)").trigger("click");
bt.soft.get_soft_find('apache', function(rdata) {
if (rdata.setup) {
if (rdata.version.indexOf('2.2') >= 0) {
if (name.indexOf('php-') != -1) {
$(".apache24").hide();
$(".bt_server").remove();
$(".bt-w-menu p:eq(0)").trigger("click");
}
if (name.indexOf('apache') != -1) {
$(".bt-soft-menu p:eq(3)").remove()
$(".bt-soft-menu p:eq(3)").remove()
}
}
}
})
}, 100)
})
},
get_tab_contents: function(key, obj) //获取设置菜单操作
{
var data = $(obj).parents('.bt-soft-menu').data('data');
var version = data.name;
if (data.name.indexOf('php-') >= 0) version = data.name.split('-')[1].replace('.', '');
switch (key) {
case 'pureftpd_log': //ftp日志管理
var tabCon = $(".soft-man-con").empty();
bt.pub.get_ftp_logs(function (_status) {
tabCon.append('<div class="inlineBlock" style="height: 30px;">\
<span style="vertical-align: middle;">Logs manage switch</span>\
<div class="ftp-log ml5" style="float: inherit;display: inline-block;vertical-align: middle;">\
<input class="btswitch btswitch-ios" id="isFtplog" type="checkbox" '+ (_status ? 'checked' : '') +'>\
<label class="btswitch-btn isFtplog" for="isFtplog"></label>\
</div>\
</div><ul class="help-info-text c7"><li>After enabling it, all login and operation records of FTP users will be logged.</li></ul>');
$('.ftp-log .isFtplog').unbind('click').click(function () {
var status = $(this).prev().prop('checked');
bt.pub.set_ftp_logs(status ? 'stop' : 'start')
})
var pro = parseInt(bt.get_cookie('pro_end') || -1)
if(pro < 0){
tabCon.append('<div class="mask_layer">\
<div class="prompt_description" style="margin-top: -60px;"><i class="layui-layer-ico layui-layer-ico0" style="width: 20px;height: 20px;display: inline-block;margin-right: 15px;vertical-align: middle;background-size: 700%;"></i>This feature is exclusive to the Professional version, <a class="btlink" onclick="bt.soft.product_pay_view({totalNum:56,limit:\''+ "ltd" +'\',closePro:false})">Buy Now</a></div></div>')
}
})
break;
case 'service':
var tabCon = $(".soft-man-con").empty();
var status_list = [{
opt: data.status ? 'stop' : 'start',
title: data.status ? lan.soft.stop : lan.soft.start
},
{
opt: 'restart',
title: lan.soft.restart
},
{
opt: 'reload',
title: lan.soft.reload
}
]
if (data.name == 'phpmyadmin') {
status_list = [status_list[0]];
}else{
var btns = $('<div class="sfm-opt"></div>');
for (var i = 0; i < status_list.length; i++) btns.append('<button class="btn btn-default btn-sm" onclick="bt.pub.set_server_status(\'' + data.name + '\',\'' + status_list[i].opt + '\')">' + status_list[i].title + '</button>');
tabCon.append('<p class="status">' + lan.soft.status + '<span>' + (data.status ? lan.soft.on : lan.soft.off) + '</span><span style="color: ' + (data.status ? '#20a53a;' : 'red;') + ' margin-left: 3px;" class="glyphicon ' + (data.status ? 'glyphicon glyphicon-play' : 'glyphicon-pause') + '"></span></p');
tabCon.append(btns);
}
// var btns = $('<div class="sfm-opt"></div>');
// for (var i = 0; i < status_list.length; i++) btns.append('<button class="btn btn-default btn-sm" onclick="bt.pub.set_server_status(\'' + data.name + '\',\'' + status_list[i].opt + '\')">' + status_list[i].title + '</button>');
// tabCon.append('<p class="status">' + lan.soft.status + '<span>' + (data.status ? lan.soft.running : lan.soft.stop) + '</span><span style="color: ' + (data.status ? '#20a53a;' : 'red;') + ' margin-left: 3px;" class="glyphicon ' + (data.status ? 'glyphicon glyphicon-play' : 'glyphicon-pause') + '"></span></p');
// tabCon.append(btns);
if (data.name == 'phpmyadmin') {
tabCon.append('<div style="padding-top:25px;">\
<div class="info-r "><input type="checkbox" class="status" '+(data.status?'checked':'')+' id="pma_status" name="status" onclick="bt.pub.set_server_status(\'' + data.name + '\',\'' + (data.status?'stop':'start') + '\')" style="vertical-align: top;margin-right: 10px;"><label class="mr20" for="pma_status" style="font-weight:normal;vertical-align: sub;">Enable public access</label></div>\
<p style="margin-top:5px;"><span>Public access address: </span><a class="btlink" href="' + data.ext.url + '" target="_blank">' + data.ext.url + '</a></p>\
</div>');
tabCon.append('<ul class="help-info-text c7 mtb15" style="padding-top:30px">\
<li>PhpMyAdmin enabling public access may have security risks. It is recommended not to enable it unnecessarily!</li>\
<li>The current version of phpmyadin no longer relies on Nginx / Apache without requiring public access.</li>\
<li>The service state of phpMyAdmin does not affect access to phpMyAdmin through the panel (non-public).</li>\
<li>If the public access right is not turned on, the panel will take over the access right, that is, you need to log in to the panel to access.</li>\
</ul>');
}
var help = '<ul class="help-info-text c7 mtb15" style="padding-top:30px"><li>' + lan.soft.mysql_mem_err + '</li></ul>';
if (name == 'mysqld') tabCon.append(help);
break;
case 'config':
var tabCon = $(".soft-man-con").empty();
tabCon.append('<p style="color: #666; margin-bottom: 7px">' + lan.bt.edit_ps + '</p>');
tabCon.append('<textarea class="bt-input-text" style="height: 320px; line-height:18px;" id="textBody"></textarea>')
tabCon.append('<button id="OnlineEditFileBtn" class="btn btn-success btn-sm" style="margin-top:10px;">' + lan.public.save + '</button>')
tabCon.append(bt.render_help([lan.get('config_edit_ps', [version])]))
var fileName = bt.soft.get_config_path(version);
if (data.php_ini) fileName = data.php_ini;
var loadT = bt.load(lan.soft.get);
bt.send('GetFileBody', 'files/GetFileBody', {
path: fileName
}, function(rdata) {
loadT.close();
$("#textBody").text(rdata.data);
$(".CodeMirror").remove();
var editor = CodeMirror.fromTextArea(document.getElementById("textBody"), {
extraKeys: {
"Ctrl-Space": "autocomplete"
},
lineNumbers: true,
matchBrackets: true,
});
editor.focus();
$(".CodeMirror-scroll").css({
"height": "510px",
"margin": 0,
"padding": 0
});
$("#OnlineEditFileBtn").click(function() {
$("#textBody").text(editor.getValue());
bt.soft.save_config(fileName, editor.getValue())
});
})
break;
case 'fpm_config':
var tabCon = $(".soft-man-con").empty();
tabCon.append('<p style="color: #666; margin-bottom: 7px">' + lan.bt.edit_ps + '</p>');
tabCon.append('<div class="bt-input-text ace_config_editor_scroll" style="line-height:18px;" id="textBody"></div>')
tabCon.append('<button id="OnlineEditFileBtn" class="btn btn-success btn-sm" style="margin-top:10px;">' + lan.public.save + '</button>')
var _arry = ['If you do not understand the php-fpm configuration file, please do not modify it!'];
tabCon.append(bt.render_help(_arry))
$('.return_php_info').click(function(){
$('.bt-soft-menu p:eq(12)').click();
});
var fileName = bt.soft.get_config_path(version).replace('php.ini','php-fpm.conf');
var loadT = bt.load(lan.soft.get);
var config = bt.aceEditor({el:'textBody',path:fileName});
$("#OnlineEditFileBtn").click(function () {
bt.saveEditor(config);
});
break;
case 'change_version':
var _list = [];
var opt_version = '';
for (var i = 0; i < data.versions.length; i++) {
if (data.versions[i].setup) opt_version = data.name + ' ' + data.versions[i].m_version;
_list.push({
value: data.name + ' ' + data.versions[i].m_version,
title: data.name + ' ' + data.versions[i].m_version
});
}
var _form_data = {
title: lan.soft.select_version,
items: [{
name: 'phpVersion',
width: '160px',
type: 'select',
value: opt_version,
items: _list
},
{
name: 'btn_change_version',
type: 'button',
text: lan.soft.version_to,
callback: function(ldata) {
if (ldata.phpVersion == opt_version) {
bt.msg({
msg: 'Is already[' + opt_version + ']',
icon: 2
})
return;
}
if (data.name == 'mysql') {
var ver = ldata.phpVersion.split("mysql "),
pdata = {sName: 'mysql', version: ver[1], type: 0};
$.post('/plugin?action=check_install_limit', pdata ,function(rdata) {
if(rdata !==null && rdata.status == false) {
bt.msg({msg: rdata.msg,icon: 2,time: 3000});
return false
}
bt.database.get_list(1, '', function(ddata) {
if (ddata.data.length > 0) {
bt.msg({
msg: lan.soft.mysql_d,
icon: 5,
time: 5000
})
return;
}
bt.soft.install_soft(data, ldata.phpVersion.split(" ")[1], 0);
})
});
} else {
bt.soft.install_soft(data, ldata.phpVersion.split(" ")[1], 0);
}
}
}
]
}
bt.render_form_line(_form_data, '', $(".soft-man-con").empty())
break;
case 'change_data_path':
bt.send('GetMySQLInfo', 'database/GetMySQLInfo', {}, function(rdata) {
var form_data = {
items: [{
type: 'text',
name: 'datadir',
value: rdata.datadir,
event: {
css: 'glyphicon-folder-open',
callback: function(obj) {
bt.select_path(obj);
}
}
},
{
name: 'btn_change_path',
type: 'button',
text: lan.soft.mysql_to,
callback: function(ldata) {
var loadT = bt.load(lan.soft.mysql_to_msg1);
bt.send('SetDataDir', 'database/SetDataDir', {
datadir: ldata.datadir
}, function(rdata) {
loadT.close();
bt.msg(rdata);
});
}
}
]
}
bt.render_form_line(form_data, '', $(".soft-man-con").empty());
});
break;
case 'change_mysql_port':
bt.send('GetMySQLInfo', 'database/GetMySQLInfo', {}, function(rdata) {
var form_data = {
items: [{
type: 'text',
width: '100px',
name: 'port',
value: rdata.port
},
{
name: 'btn_change_port',
type: 'button',
text: lan.public.edit,
callback: function(ldata) {
var loadT = bt.load();
bt.send('SetMySQLPort', 'database/SetMySQLPort', {
port: ldata.port
}, function(rdata) {
loadT.close();
bt.msg(rdata);
});
}
}
]
}
bt.render_form_line(form_data, '', $(".soft-man-con").empty());
});
break;
case 'change_mysql_ssl':
bt.send('check_mysql_ssl_status', 'database/check_mysql_ssl_status', {}, function(rdata) {
var form_data = {
title: 'Mysql SSL',
items: [{
type: 'switch',
name: 'write_ssl',
value: rdata
}
]
};
bt.render_form_line(form_data, '', $(".soft-man-con").empty());
var downssl = "/www/server/data/ssl.zip";
$(".soft-man-con").append(bt.render_help(["After setting, manually restart the database to take effect","Download Mysql SSL self-signed certificate<a class='btlink downssl' href='javascript:;'>【SSL.zip】</a>"]));
$("a.downssl").click(function() {
window.open('/download?filename=' + encodeURIComponent(downssl));
});
$("#write_ssl").change(function() {
var loadT = bt.load();
$.post('/database?action=write_ssl_to_mysql', function(rdata) {
loadT.close(loadT);
var open_type = $("#write_ssl").prop('checked')?'turned on':'turned off',
loadP = layer.confirm('The SSL setting is '+open_type+' successfully.<br> Do you need to restart the database immediately to make it effective?', {
btn: ['Restart now', 'Restart later'],
icon: 3,
title: 'Confirm Restart?'
}, function() {
bt.pub.set_server_status('mysql','restart');
}, function() {
layer.close(loadP);
});
});
});
});
break;
case 'get_mysql_run_status':
bt.send('GetRunStatus', 'database/GetRunStatus', {}, function(rdata) {
var cache_size = ((parseInt(rdata.Qcache_hits) / (parseInt(rdata.Qcache_hits) + parseInt(rdata.Qcache_inserts))) * 100).toFixed(2) + '%';
if (cache_size == 'NaN%') cache_size = 'OFF';
var title10 = ((1 - rdata.Threads_created / rdata.Connections) * 100).toFixed(2);
var title11 = ((1 - rdata.Key_reads / rdata.Key_read_requests) * 100).toFixed(2);
var title12 = ((1 - rdata.Innodb_buffer_pool_reads / rdata.Innodb_buffer_pool_read_requests) * 100).toFixed(2);
var title14 = ((rdata.Created_tmp_disk_tables / rdata.Created_tmp_tables) * 100).toFixed(2);
var Con = '<div class="divtable"><table class="table table-hover table-bordered" style="background-color:#fafafa">\
<tbody>\
<tr><th>' + lan.soft.mysql_status_title1 + '</th><td>' + getLocalTime(rdata.Run) + '</td><th>' + lan.soft.mysql_status_title5 + '</th><td>' + parseInt(rdata.Questions / rdata.Uptime) + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title2 + '</th><td>' + rdata.Connections + '</td><th>' + lan.soft.mysql_status_title6 + '</th><td>' + parseInt((parseInt(rdata.Com_commit) + parseInt(rdata.Com_rollback)) / rdata.Uptime) + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title3 + '</th><td>' + ToSize(rdata.Bytes_sent) + '</td><th>' + lan.soft.mysql_status_title7 + '</th><td>' + rdata.File + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title4 + '</th><td>' + ToSize(rdata.Bytes_received) + '</td><th>' + lan.soft.mysql_status_title8 + '</th><td>' + rdata.Position + '</td></tr>\
</tbody>\
</table>\
<table class="table table-hover table-bordered">\
<thead style="visibility: hidden;"><th width="225"></th><th></th><th></th></thead>\
<tbody>\
<tr><th>' + lan.soft.mysql_status_title9 + '</th><td>' + rdata.Threads_running + '/' + rdata.Max_used_connections + '</td><td>' + lan.soft.mysql_status_ps1 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title10 + '</th><td>' + (!isNaN(title10) ? title10 : '0') + '%</td><td>' + lan.soft.mysql_status_ps2 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title11 + '</th><td>' + (!isNaN(title11) ? title11 : '0') + '%</td><td>' + lan.soft.mysql_status_ps3 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title12 + '</th><td>' + (!isNaN(title12) ? title12 : '0') + '%</td><td>' + lan.soft.mysql_status_ps4 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title13 + '</th><td>' + cache_size + '</td><td>' + lan.soft.mysql_status_ps5 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title14 + '</th><td>' + (!isNaN(title14) ? title14 : '0') + '%</td><td>' + lan.soft.mysql_status_ps6 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title15 + '</th><td>' + rdata.Open_tables + '</td><td>' + lan.soft.mysql_status_ps7 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title16 + '</th><td>' + rdata.Select_full_join + '</td><td>' + lan.soft.mysql_status_ps8 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title17 + '</th><td>' + rdata.Select_range_check + '</td><td>' + lan.soft.mysql_status_ps9 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title18 + '</th><td>' + rdata.Sort_merge_passes + '</td><td>' + lan.soft.mysql_status_ps10 + '</td></tr>\
<tr><th>' + lan.soft.mysql_status_title19 + '</th><td>' + rdata.Table_locks_waited + '</td><td>' + lan.soft.mysql_status_ps11 + '</td></tr>\
<tbody>\
</table></div>'
$(".soft-man-con").html(Con);
})
break;
case 'get_mysql_status':
bt.send('GetDbStatus', 'database/GetDbStatus', {}, function(rdata) {
var key_buffer_size = bt.format_size(rdata.mem.key_buffer_size, false, 0, 'MB')
var query_cache_size = bt.format_size(rdata.mem.query_cache_size, false, 0, 'MB')
var tmp_table_size = bt.format_size(rdata.mem.tmp_table_size, false, 0, 'MB')
var innodb_buffer_pool_size = bt.format_size(rdata.mem.innodb_buffer_pool_size, false, 0, 'MB')
var innodb_additional_mem_pool_size = bt.format_size(rdata.mem.innodb_additional_mem_pool_size, false, 0, 'MB')
var innodb_log_buffer_size = bt.format_size(rdata.mem.innodb_log_buffer_size, false, 0, 'MB')
var sort_buffer_size = bt.format_size(rdata.mem.sort_buffer_size, false, 0, 'MB')
var read_buffer_size = bt.format_size(rdata.mem.read_buffer_size, false, 0, 'MB')
var read_rnd_buffer_size = bt.format_size(rdata.mem.read_rnd_buffer_size, false, 0, 'MB')
var join_buffer_size = bt.format_size(rdata.mem.join_buffer_size, false, 0, 'MB')
var thread_stack = bt.format_size(rdata.mem.thread_stack, false, 0, 'MB')
var binlog_cache_size = bt.format_size(rdata.mem.binlog_cache_size, false, 0, 'MB')
var a = key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size
var b = sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack + binlog_cache_size
var memSize = a + rdata.mem.max_connections * b
var mysql_select = {
'1': {
title: '1-2GB',
data: {
key_buffer_size: 128,
query_cache_size: 64,
tmp_table_size: 64,
innodb_buffer_pool_size: 256,
sort_buffer_size: 768,
read_buffer_size: 768,
read_rnd_buffer_size: 512,
join_buffer_size: 1024,
thread_stack: 256,
binlog_cache_size: 64,
thread_cache_size: 64,
table_open_cache: 128,
max_connections: 100
}
},
'2': {
title: '2-4GB',
data: {
key_buffer_size: 256,
query_cache_size: 128,
tmp_table_size: 384,
innodb_buffer_pool_size: 384,
sort_buffer_size: 768,
read_buffer_size: 768,
read_rnd_buffer_size: 512,
join_buffer_size: 2048,
thread_stack: 256,
binlog_cache_size: 64,
thread_cache_size: 96,
table_open_cache: 192,
max_connections: 200
}
},
'3': {
title: '4-8GB',
data: {
key_buffer_size: 384,
query_cache_size: 192,
tmp_table_size: 512,
innodb_buffer_pool_size: 512,
sort_buffer_size: 1024,
read_buffer_size: 1024,
read_rnd_buffer_size: 768,
join_buffer_size: 2048,
thread_stack: 256,
binlog_cache_size: 128,
thread_cache_size: 128,
table_open_cache: 384,
max_connections: 300
}
},
'4': {
title: '8-16GB',
data: {
key_buffer_size: 512,
query_cache_size: 256,
tmp_table_size: 1024,
innodb_buffer_pool_size: 1024,
sort_buffer_size: 2048,
read_buffer_size: 2048,
read_rnd_buffer_size: 1024,
join_buffer_size: 4096,
thread_stack: 384,
binlog_cache_size: 192,
thread_cache_size: 192,
table_open_cache: 1024,
max_connections: 400
}
},
'5': {
title: '16-32GB',
data: {
key_buffer_size: 1024,
query_cache_size: 384,
tmp_table_size: 2048,
innodb_buffer_pool_size: 4096,
sort_buffer_size: 4096,
read_buffer_size: 4096,
read_rnd_buffer_size: 2048,
join_buffer_size: 8192,
thread_stack: 512,
binlog_cache_size: 256,
thread_cache_size: 256,
table_open_cache: 2048,
max_connections: 500
}
}
}
var mysql_arrs = [{
value: 0,
title: lan.soft.mysql_set_select
}]
for (var key in mysql_select) mysql_arrs.push({
value: key,
title: mysql_select[key].title
})
var form_datas = [{
items: [{
title: lan.soft.mysql_set_msg,
name: 'mysql_set',
type: 'select',
items: mysql_arrs,
callback: function(item) {
if (item.val() > 0) {
var data = mysql_select[item.val()].data;
for (var key in data) $('.' + key).val(data[key]);
if (!data.query_cache_size) data['query_cache_size'] = 0;
$("input[name='max_connections']").trigger('change')
}
}
},
{
title: lan.soft.mysql_set_maxmem,
name: 'memSize',
width: '70px',
disabled: true,
value: memSize.toFixed(2),
ps: 'MB'
}
]
},
{
title: 'key_buffer_size',
type: 'number',
name: 'key_buffer_size',
width: '70px',
value: key_buffer_size,
ps: 'MB, <font>' + lan.soft.mysql_set_key_buffer_size + '</font>'
},
{
title: 'query_cache_size',
type: 'number',
name: 'query_cache_size',
width: '70px',
value: query_cache_size,
ps: 'MB, <font>' + lan.soft.mysql_set_query_cache_size + '</font>'
},
{
title: 'tmp_table_size',
type: 'number',
name: 'tmp_table_size',
width: '70px',
value: tmp_table_size,
ps: 'MB, <font>' + lan.soft.mysql_set_tmp_table_size + '</font>'
},
{
title: 'innodb_buffer_pool_size',
type: 'number',
name: 'innodb_buffer_pool_size',
value: innodb_buffer_pool_size,
width: '70px',
ps: 'MB, <font>' + lan.soft.mysql_set_innodb_buffer_pool_size + '</font>'
},
{
title: 'innodb_log_buffer_size',
type: 'number',
name: 'innodb_log_buffer_size',
value: innodb_log_buffer_size,
width: '70px',
ps: 'MB, <font>' + lan.soft.mysql_set_innodb_log_buffer_size + '</font>'
},
{
title: 'sort_buffer_size',
type: 'number',
name: 'sort_buffer_size',
width: '70px',
value: (sort_buffer_size * 1024),
ps: 'KB * ' + lan.soft.mysql_set_conn + ', <font>' + lan.soft.mysql_set_sort_buffer_size + '</font>'
},
{
title: 'read_buffer_size',
type: 'number',
name: 'read_buffer_size',
width: '70px',
value: (read_buffer_size * 1024),
ps: 'KB * ' + lan.soft.mysql_set_conn + ', <font>' + lan.soft.mysql_set_read_buffer_size + '</font>'
},
{
title: 'read_rnd_buffer_size',
type: 'number',
name: 'read_rnd_buffer_size',
width: '70px',
value: (read_rnd_buffer_size * 1024),
ps: 'KB * ' + lan.soft.mysql_set_conn + ', <font>' + lan.soft.mysql_set_read_rnd_buffer_size + '</font>'
},
{
title: 'join_buffer_size',
type: 'number',
name: 'join_buffer_size',
width: '70px',
value: (join_buffer_size * 1024),
ps: 'KB * ' + lan.soft.mysql_set_conn + ', <font>' + lan.soft.mysql_set_join_buffer_size + '</font>'
},
{
title: 'thread_stack',
type: 'number',
name: 'thread_stack',
width: '70px',
value: (thread_stack * 1024),
ps: 'KB * ' + lan.soft.mysql_set_conn + ', <font>' + lan.soft.mysql_set_thread_stack + '</font>'
},
{
title: 'binlog_cache_size',
type: 'number',
name: 'binlog_cache_size',
value: (binlog_cache_size * 1024),
width: '70px',
ps: 'KB * ' + lan.soft.mysql_set_conn + ', <font>' + lan.soft.mysql_set_binlog_cache_size + '</font>'
},
{
title: 'thread_cache_size',
type: 'number',
name: 'thread_cache_size',
value: rdata.mem.thread_cache_size,
width: '70px',
ps: lan.soft.mysql_set_thread_cache_size
},
{
title: 'table_open_cache',
type: 'number',
name: 'table_open_cache',
value: rdata.mem.table_open_cache,
width: '70px',
ps: lan.soft.mysql_set_table_open_cache
},
{
title: 'max_connections',
type: 'number',
name: 'max_connections',
value: rdata.mem.max_connections,
width: '70px',
ps: lan.soft.mysql_set_max_connections
},
{
items: [{
text: lan.soft.mysql_set_restart,
type: 'button',
name: 'bt_mysql_restart',
callback: function(ldata) {
bt.pub.set_server_status('mysqld', 'restart');
}
},
{
text: lan.public.save,
type: 'button',
name: 'bt_mysql_save',
callback: function(ldata) {
ldata.query_cache_type = 0;
if (ldata.query_cache_size > 0) ldata.query_cache_type = 1;
ldata['max_heap_table_size'] = ldata.tmp_table_size;
bt.send('SetDbConf', 'database/SetDbConf', ldata, function(rdata) {
layer.msg(rdata.msg, {
icon: rdata.status ? 1 : 2
});
});
}
}
]
}
]
var tabCon = $(".soft-man-con").empty().append("<div class='tab-db-status'></div>");
for (var i = 0; i < form_datas.length; i++) {
bt.render_form_line(form_datas[i], '', $('.tab-db-status'));
}
$(".tab-db-status input[name*='size'],.tab-db-status input[name='max_connections'],.tab-db-status input[name='thread_stack']").change(function() {
var key_buffer_size = parseInt($("input[name='key_buffer_size']").val());
var query_cache_size = parseInt($("input[name='query_cache_size']").val());
var tmp_table_size = parseInt($("input[name='tmp_table_size']").val());
var innodb_buffer_pool_size = parseInt($("input[name='innodb_buffer_pool_size']").val());
var innodb_log_buffer_size = parseInt($("input[name='innodb_log_buffer_size']").val());
var sort_buffer_size = $("input[name='sort_buffer_size']").val() / 1024;
var read_buffer_size = $("input[name='read_buffer_size']").val() / 1024;
var read_rnd_buffer_size = $("input[name='read_rnd_buffer_size']").val() / 1024;
var join_buffer_size = $("input[name='join_buffer_size']").val() / 1024;
var thread_stack = $("input[name='thread_stack']").val() / 1024;
var binlog_cache_size = $("input[name='binlog_cache_size']").val() / 1024;
var max_connections = $("input[name='max_connections']").val();
var a = key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size
var b = sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack + binlog_cache_size
var memSize = a + max_connections * b
$("input[name='memSize']").val(memSize.toFixed(2));
});
})
break;
case 'mysql_log':
var loadT = bt.load();
bt.send('BinLog', 'database/BinLog', {
status: 1
}, function(rdata) {
loadT.close();
var limitCon = '<p class="conf_p">\
<span class="f14 c6 mr20">' + lan.soft.mysql_log_bin + ' </span><span class="f14 c6 mr20">' + ToSize(rdata.msg) + '</span>\
<button class="btn btn-success btn-xs btn-bin va0">' + (rdata.status ? lan.soft.off : lan.soft.on) + '</button>\
<p class="f14 c6 mtb10" style="border-top:#ddd 1px solid; padding:10px 0">' + lan.soft.mysql_log_err + '<button class="btn btn-default btn-clear btn-xs" style="float:right;" >' + lan.soft.mysql_log_close + '</button></p>\
<textarea readonly style="margin: 0px;width: 597px;height: 538px;background-color: #333;color:#fff; padding:0 5px" id="error_log"></textarea>\
</p>'
$(".soft-man-con").html(limitCon);
//设置二进制日志
$(".btn-bin").click(function() {
var loadT = layer.msg(lan.public.the, {
icon: 16,
time: 0,
shade: 0.3
});
$.post('/database?action=BinLog', "", function(rdata) {
layer.close(loadT);
layer.msg(rdata.msg, {
icon: rdata.status ? 1 : 5
});
soft.get_tab_contents('mysql_log')
});
})
//清空日志
$(".btn-clear").click(function() {
var loadT = layer.msg(lan.public.the, {
icon: 16,
time: 0,
shade: 0.3
});
$.post('/database?action=GetErrorLog', "close=1", function(rdata) {
layer.close(loadT);
layer.msg(rdata.msg, {
icon: rdata.status ? 1 : 5
});
soft.get_tab_contents('mysql_log')
});
})
bt.send('GetErrorLog', 'database/GetErrorLog', {}, function(error_body) {
if (error_body.status === false) {
layer.msg(error_body.msg, {
icon: 5
});
error_body = lan.soft.mysql_log_ps1;
}
if (error_body == "") error_body = lan.soft.mysql_log_ps1;
$("#error_log").text(error_body);
var ob = document.getElementById('error_log');
ob.scrollTop = ob.scrollHeight;
});
})
break;
case 'mysql_slow_log':
var loadT = bt.load();
bt.send('GetSlowLogs', 'database/GetSlowLogs', {}, function(logs) {
loadT.close();
if (!logs.status) {
logs.msg = '';
}
if (logs.msg == '') logs.msg = lan.soft.no_slow_log;
var phpCon = '<textarea readonly="" style="margin: 0px;width: 601px;height: 619px;background-color: #333;color:#fff; padding:0 5px" id="error_log">' + logs.msg + '</textarea>';
$(".soft-man-con").html(phpCon);
var ob = document.getElementById('error_log');
ob.scrollTop = ob.scrollHeight;
})
break;
case 'log':
var loadT = bt.load(lan.public.the_get);
bt.send('GetOpeLogs', 'ajax/GetOpeLogs', {
path: '/www/wwwlogs/nginx_error.log'
}, function(rdata) {
loadT.close();
if (rdata.msg == '') rdata.msg = lan.soft.no_log;
var ebody = '<div class="soft-man-con"><textarea readonly="" style="margin: 0px;width: 600px;height: 520px;background-color: #333;color:#fff; padding:0 5px" id="error_log">' + rdata.msg + '</textarea></div>';
$(".soft-man-con").html(ebody);
var ob = document.getElementById('error_log');
ob.scrollTop = ob.scrollHeight;
})
break;
case 'nginx_status':
var loadT = bt.load();
bt.send('GetNginxStatus', 'ajax/GetNginxStatus', {}, function(rdata) {
loadT.close();
$(".soft-man-con").html("<div><table id='tab-nginx-status' class='table table-hover table-bordered'> </table></div>");
var arrs = []
arrs[lan.bt.nginx_active] = rdata.active;
arrs[lan.bt.nginx_accepts] = rdata.accepts;
arrs[lan.bt.nginx_handled] = rdata.handled;
arrs[lan.bt.nginx_requests] = rdata.requests;
arrs[lan.bt.nginx_reading] = rdata.Reading;
arrs[lan.bt.nginx_writing] = rdata.Writing;
arrs[lan.bt.nginx_waiting] = rdata.Waiting;
arrs[lan.bt.nginx_worker] = rdata.worker;
arrs[lan.bt.nginx_workercpu] = rdata.workercpu;
arrs[lan.bt.nginx_workermen] = rdata.workermen;
bt.render_table("tab-nginx-status", arrs);
})
break;
case 'nginx_format_log':
var loadT = bt.load();
bt.send('get_nginx_access_log_format', 'config/get_nginx_access_log_format', {}, function(rdata) {
$(".soft-man-con").html("<button class='btn btn-success btn-sm mb15 table-add-format'>Add format</button><div class='divtable' style='max-height: 570px;overflow: auto;'><table id='tab-nginx-logs-format' class='table table-hover'><thead><tr><th width='15%'>Name</th><th>Format</th><th width='120' style='text-align:right;'>Opt</th></tr></thead><tbody></tbody></table></div>");
bt.send('get_nginx_access_log_format_parameter', 'config/get_nginx_access_log_format_parameter', {}, function(res) {
loadT.close();
var _format_ul = '<ul class="bt-select-list">';
Object.keys(res).map(function(key){
_format_ul += '<li data-val="'+key+'">'+key+'&nbsp;:&nbsp;'+res[key]+'</li>';
})
_format_ul += '</ul>';
for (const j in rdata) {
if (rdata.hasOwnProperty(j)) {
const result = rdata[j];
var _format = result.map(function(item, index){
return Object.keys(item)[0];
});
var element = '<span class="nginx-one-format">' + _format.join('</span><span class="nginx-one-format">') + '</span>',
_td = '<tr><td>'+j+'</td>\
<td>'+element+'</td>\
<td align="right" data-name="'+j+'"><a class="btlink table-apply-format">Apply</a> | <a class="btlink table-set-format">Set</a> | <a class="btlink table-del-format">Del</a></td></tr>';
$("#tab-nginx-logs-format tbody").append(_td);
//表格头固定
$('#tab-nginx-logs-format').parent().on('scroll', function () {
var scrollTop = $('#tab-nginx-logs-format').parent().scrollTop();
$('#tab-nginx-logs-format thead').css({"transform":"translateY("+scrollTop+"px)","position":"relative","z-index":"1"});
});
}
}
$('.table-add-format, .table-set-format').click(function() {
if($(this).hasClass('table-set-format')) {
var format_title = 'Set format',
first_format = '',
add_type = 'edit',
td_format = $(this).parent().prev().find('.nginx-one-format');
format_name = $(this).parent().attr('data-name');
for (var i = 0; i < td_format.length; i++) {
first_format += '<div class="line">\
<div class="bt-select">\
<div class="bt-select-input plr10">\
<div class="bt-select-val" data-active="'+td_format.eq(i).text()+'">'+td_format.eq(i).text()+'</div>\
<span class="bt-down-icon"></span>\
</div>\
</div>\
<a href="javascript:;" class="del-format">Del</a>\
</div>';
}
}else{
var format_title = 'Add format',
format_name = '',
add_type = 'add',
first_format = '',
format_list = ['$http_x_forwarded_for','$remote_addr','-','[$time_local]','$request','$status','$body_bytes_sent','$http_referer','$http_user_agent'];
for (var i = 0; i < format_list.length; i++) {
first_format += '<div class="line">\
<div class="bt-select">\
<div class="bt-select-input plr10">\
<div class="bt-select-val" data-active="'+format_list[i]+'">'+format_list[i]+'</div>\
<span class="bt-down-icon"></span>\
</div>\
</div>\
<a href="javascript:;" class="del-format">Del</a>\
</div>';
}
}
layer.open({
type: 1,
title: format_title,
closeBtn: 2,
area: '375px',
btn: ['Confirm', 'Cancel'],
content: '<div class="bt-form pd20 nginx-add-format" style="position: relative;">\
<div class="line" style="font-size: 13px;">\
<span style="text-align: right;display: inline-block;margin-right: 7px;width: 50px;">Name: </span>\
<input name="log_format_name" class="bt-input-text" type="text" style="width:274px" placeholder = "Please enter the format name.">\
</div>\
<span style="position: absolute;top: 70px;left: 25px;">Format:</span>\
<div style="position: relative;margin-left: 60px;">\
<div class="format-table">'+first_format+'</div>\
'+_format_ul+'\
</div>\
<button class="btn btn-success btn-sm btn-title btn-add-format" type="button" style="margin-top: 10px;margin-left: 60px;"><span class="glyphicon cursor glyphicon-plus mr5"></span>Add parameter</button>\
<ul class="help-info-text c7"><li>The format are executed in the order of parameters.</li></ul>\
</div>',
success: function(index, layero) {
$('.nginx-add-format [name=log_format_name]').val(format_name);
$('.nginx-add-format').parents('.layui-layer-content').css('overflow','inherit');
$('.nginx-add-format').on('click', '.bt-select-input', function (e) {
if($(this).hasClass('active')){
$('.nginx-add-format .bt-select-list').removeClass('active');
$(this).removeClass('active').find('.bt-down-icon').css('transform','rotate(-45deg)');
}else{
var _choose = $(this).find('.bt-select-val').text();
$('.bt-select-list li').removeClass('active');
$('.active.bt-select-input').removeClass('active').find('.bt-down-icon').css('transform','rotate(-45deg)')
$('.bt-select-list li:contains('+_choose+')').addClass('active');
$('.nginx-add-format .bt-select-list').addClass('active').css('top',$(this).offset().top-$('.format-table').offset().top+33);
$(this).addClass('active').find('.bt-down-icon').css('transform','rotate(135deg)');
}
e.stopPropagation();
$(document).click(function(e){
$('.active.bt-select-list').removeClass('active');
$(this).find('.bt-down-icon').css('transform','rotate(-45deg)');
e.preventDefault();
e.stopPropagation();
});
});
$('.nginx-add-format').on('click', '.bt-select-list li', function (e) {
var _value = $(this).attr('data-val');
$('.active.bt-select-input').find('.bt-select-val').attr('data-active',_value).text(_value);
$('.nginx-add-format .bt-select-list,.active.bt-select-input').removeClass('active');
});
$('.btn-add-format').click(function (e) {
var _new_line = '<div class="line">\
<div class="bt-select">\
<div class="bt-select-input plr10">\
<div class="bt-select-val" data-active="$server_name">$server_name</div>\
<span class="bt-down-icon" ></span>\
</div>\
</div>\
<a href="javascript:;" class="del-format">Del</a>\
</div>';
$('.format-table').append(_new_line);
$('.format-table').scrollTop(10000000)
});
$('.nginx-add-format').on('click', '.del-format', function (e) {
if ($('.del-format').length == 1) {
layer.msg('This is the last parameter.', {icon: 2});
return false;
}
$(this).parent().remove();
});
},
yes: function(index, layero) {
if ($('.nginx-add-format [name=log_format_name]').val()=='') {
layer.msg('The format name cannot be empty!', {icon: 2});
return false;
}
var log_format = [];
$(".nginx-add-format .format-table .bt-select-val").each(function(){
log_format.push($(this).attr("data-active"));
});
var format_data = {
"log_format_name": $('.nginx-add-format [name=log_format_name]').val(),
"log_format": JSON.stringify(log_format),
"act": add_type
}
bt.send('add_nginx_access_log_format', 'config/add_nginx_access_log_format', format_data, function(res) {
layer.close(index);
$('.bt-soft-menu p:contains("Logs format")').click();
layer.msg(res.msg, {icon: res.status ? 1 : 2});
})
}
})
});
$('#tab-nginx-logs-format').on('click', '.table-del-format', function (e) {
var log_format_name = $(this).parent().attr('data-name'),
loadP = layer.confirm('Confirm to delete【'+log_format_name+'】this logs format?', {
title: 'Confirm Delete?',
closeBtn: 2
}, function() {
layer.close(loadP);
bt.send('del_nginx_access_log_format', 'config/del_nginx_access_log_format', {'log_format_name': log_format_name}, function(res) {
if(res.status) $('.bt-soft-menu p:contains("Logs format")').click();
layer.msg(res.msg, {icon: res.status ? 1 : 2});
});
});
});
$('#tab-nginx-logs-format').on('click', '.table-apply-format', function (e) {
var log_format_name = $(this).parent().attr('data-name');
bt.send('get_nginx_access_log_format_parameter', 'config/get_nginx_access_log_format_parameter', {'log_format_name':log_format_name}, function(res) {
if (Object.keys(res.site_list).length == 0) {
layer.msg('There is no site can apply!', {icon: 2});
return false;
}
var _site_ul = '<ul class="format-site-list">';
Object.keys(res.site_list).map(function(key){
_site_ul += '<li style="padding: 10px"><div class="bt_checkbox_groups'+(res.site_list[key]?' active':'')+'" data-val="'+key+'"></div>'+key+'</li>';
});
_site_ul += '</ul>';
layer.open({
type: 1,
title: 'Website apply format',
closeBtn: 2,
btn: ['Confirm', 'Cancel'],
content: '<div class="bt-form pd20 nginx-add-site" style="font-size: 13px;">\
<div class="line">\
<span style="text-align: right;display: inline-block;position: absolute;">Site: </span>\
'+_site_ul+'\
</div>\
<div class="line c7">The checked site would used the format.</div>\
</div>',
success: function(index, layero) {
$('.nginx-add-site').on('click', '.format-site-list li', function (e) {
if ($(this).find('.bt_checkbox_groups').hasClass('active')) {
$(this).find('.bt_checkbox_groups').removeClass('active');
} else {
$(this).find('.bt_checkbox_groups').addClass('active');
}
});
},
yes: function(index, layero) {
var sites = [];
$(".nginx-add-site .format-site-list .bt_checkbox_groups.active").each(function(){
sites.push($(this).attr("data-val"));
});
var format_data = {
"log_format_name": log_format_name,
"sites": JSON.stringify(sites)
}
bt.send('set_format_log_to_website', 'config/set_format_log_to_website', format_data, function(res) {
layer.close(index);
if(res.status) $('.bt-soft-menu p:contains("Logs format")').click();
layer.msg(res.msg, {icon: res.status ? 1 : 2});
})
}
})
});
});
});
});
break;
case 'apache_format_log':
var loadT = bt.load();
bt.send('get_httpd_access_log_format', 'config/get_httpd_access_log_format', {}, function(rdata) {
$(".soft-man-con").html("<button class='btn btn-success btn-sm mb15 table-add-format'>Add format</button><div class='divtable' style='max-height: 570px;overflow: auto;'><table id='tab-nginx-logs-format' class='table table-hover'><thead><tr><th width='15%'>Name</th><th>Format</th><th width='120' style='text-align:right;'>Opt</th></tr></thead><tbody></tbody></table></div>");
bt.send('get_httpd_access_log_format_parameter', 'config/get_httpd_access_log_format_parameter', {}, function(res) {
loadT.close();
var _format_ul = '<ul class="bt-select-list">';
Object.keys(res).map(function(key){
_format_ul += '<li data-val="'+key+'">'+key+'&nbsp;:&nbsp;'+res[key]+'</li>';
})
_format_ul += '</ul>';
for (const j in rdata) {
if (rdata.hasOwnProperty(j)) {
const result = rdata[j];
var _format = result.map(function(item, index){
return Object.keys(item)[0];
});
var element = '<span class="nginx-one-format">' + _format.join('</span><span class="nginx-one-format">') + '</span>',
_td = '<tr><td>'+j+'</td>\
<td>'+element+'</td>\
<td align="right" data-name="'+j+'"><a class="btlink table-apply-format">Apply</a> | <a class="btlink table-set-format">Set</a> | <a class="btlink table-del-format">Del</a></td></tr>';
$("#tab-nginx-logs-format tbody").append(_td);
//表格头固定
$('#tab-nginx-logs-format').parent().on('scroll', function () {
var scrollTop = $('#tab-nginx-logs-format').parent().scrollTop();
$('#tab-nginx-logs-format thead').css({"transform":"translateY("+scrollTop+"px)","position":"relative","z-index":"1"});
});
}
}
$('.table-add-format, .table-set-format').click(function() {
if($(this).hasClass('table-set-format')) {
var format_title = 'Set format',
first_format = '',
add_type = 'edit',
td_format = $(this).parent().prev().find('.nginx-one-format');
format_name = $(this).parent().attr('data-name');
for (var i = 0; i < td_format.length; i++) {
first_format += '<div class="line">\
<div class="bt-select">\
<div class="bt-select-input plr10">\
<div class="bt-select-val" data-active="'+td_format.eq(i).text()+'">'+td_format.eq(i).text()+'</div>\
<span class="bt-down-icon"></span>\
</div>\
</div>\
<a href="javascript:;" class="del-format">Del</a>\
</div>';
}
}else{
var format_title = 'Add format',
format_name = '',
add_type = 'add',
first_format = '',
format_list = ['%{X-Forwarded-For}i','%h','%l','%u','%t','%r','%>s','%b','%{Referer}i','%{User-agent}i'];
for (var i = 0; i < format_list.length; i++) {
first_format += '<div class="line">\
<div class="bt-select">\
<div class="bt-select-input plr10">\
<div class="bt-select-val" data-active="'+format_list[i]+'">'+format_list[i]+'</div>\
<span class="bt-down-icon"></span>\
</div>\
</div>\
<a href="javascript:;" class="del-format">Del</a>\
</div>';
}
}
layer.open({
type: 1,
title: format_title,
closeBtn: 2,
area: '375px',
btn: ['Confirm', 'Cancel'],
content: '<div class="bt-form pd20 nginx-add-format" style="position: relative;">\
<div class="line" style="font-size: 13px;">\
<span style="text-align: right;display: inline-block;margin-right: 7px;width: 50px;">Name: </span>\
<input name="log_format_name" class="bt-input-text" type="text" style="width:274px" placeholder = "Please enter the format name.">\
</div>\
<span style="position: absolute;top: 70px;left: 25px;">Format:</span>\
<div style="position: relative;margin-left: 60px;">\
<div class="format-table">'+first_format+'</div>\
'+_format_ul+'\
</div>\
<button class="btn btn-success btn-sm btn-title btn-add-format" type="button" style="margin-top: 10px;margin-left: 60px;"><span class="glyphicon cursor glyphicon-plus mr5"></span>Add parameter</button>\
<ul class="help-info-text c7"><li>The format are executed in the order of parameters.</li></ul>\
</div>',
success: function(index, layero) {
$('.nginx-add-format [name=log_format_name]').val(format_name);
$('.nginx-add-format').parents('.layui-layer-content').css('overflow','inherit');
$('.nginx-add-format').on('click', '.bt-select-input', function (e) {
if($(this).hasClass('active')){
$('.nginx-add-format .bt-select-list').removeClass('active');
$(this).removeClass('active').find('.bt-down-icon').css('transform','rotate(-45deg)');
}else{
var _choose = $(this).find('.bt-select-val').text();
$('.bt-select-list li').removeClass('active');
$('.active.bt-select-input').removeClass('active').find('.bt-down-icon').css('transform','rotate(-45deg)')
$('.bt-select-list li:contains('+_choose+')').addClass('active');
$('.nginx-add-format .bt-select-list').addClass('active').css('top',$(this).offset().top-$('.format-table').offset().top+33);
$(this).addClass('active').find('.bt-down-icon').css('transform','rotate(135deg)');
}
e.stopPropagation();
$(document).click(function(e){
$('.active.bt-select-list').removeClass('active');
$(this).find('.bt-down-icon').css('transform','rotate(-45deg)');
e.preventDefault();
e.stopPropagation();
});
});
$('.nginx-add-format').on('click', '.bt-select-list li', function (e) {
var _value = $(this).attr('data-val');
$('.active.bt-select-input').find('.bt-select-val').attr('data-active',_value).text(_value);
$('.nginx-add-format .bt-select-list,.active.bt-select-input').removeClass('active');
});
$('.btn-add-format').click(function (e) {
var _new_line = '<div class="line">\
<div class="bt-select">\
<div class="bt-select-input plr10">\
<div class="bt-select-val" data-active="%>s">%>s</div>\
<span class="bt-down-icon" ></span>\
</div>\
</div>\
<a href="javascript:;" class="del-format">Del</a>\
</div>';
$('.format-table').append(_new_line);
$('.format-table').scrollTop(10000000)
});
$('.nginx-add-format').on('click', '.del-format', function (e) {
if ($('.del-format').length == 1) {
layer.msg('This is the last parameter.', {icon: 2});
return false;
}
$(this).parent().remove();
});
},
yes: function(index, layero) {
if ($('.nginx-add-format [name=log_format_name]').val()=='') {
layer.msg('The format name cannot be empty!', {icon: 2});
return false;
}
var log_format = [];
$(".nginx-add-format .format-table .bt-select-val").each(function(){
log_format.push($(this).attr("data-active"));
});
var format_data = {
"log_format_name": $('.nginx-add-format [name=log_format_name]').val(),
"log_format": JSON.stringify(log_format),
'act':add_type
}
bt.send('add_httpd_access_log_format', 'config/add_httpd_access_log_format', format_data, function(res) {
layer.close(index);
if(res.status) $('.bt-soft-menu p:contains("Logs format")').click();
layer.msg(res.msg, {icon: res.status ? 1 : 2});
})
}
})
});
$('#tab-nginx-logs-format').on('click', '.table-del-format', function (e) {
var log_format_name = $(this).parent().attr('data-name'),
loadP = layer.confirm('Confirm to delete【'+log_format_name+'】this logs format?', {
title: 'Confirm Delete?',
closeBtn: 2
}, function() {
layer.close(loadP);
bt.send('del_httpd_access_log_format', 'config/del_httpd_access_log_format', {'log_format_name': log_format_name}, function(res) {
if(res.status) $('.bt-soft-menu p:contains("Logs format")').click();
layer.msg(res.msg, {icon: res.status ? 1 : 2});
});
});
});
$('#tab-nginx-logs-format').on('click', '.table-apply-format', function (e) {
var log_format_name = $(this).parent().attr('data-name');
bt.send('get_httpd_access_log_format_parameter', 'config/get_httpd_access_log_format_parameter', {'log_format_name':log_format_name}, function(res) {
if (Object.keys(res.site_list).length == 0) {
layer.msg('There is no site can apply!', {icon: 2});
return false;
}
var _site_ul = '<ul class="format-site-list">';
Object.keys(res.site_list).map(function(key){
_site_ul += '<li style="padding: 10px"><div class="bt_checkbox_groups'+(res.site_list[key]?' active':'')+'" data-val="'+key+'"></div>'+key+'</li>';
});
_site_ul += '</ul>';
layer.open({
type: 1,
title: 'Website apply format',
closeBtn: 2,
btn: ['Confirm', 'Cancel'],
content: '<div class="bt-form pd20 nginx-add-site" style="font-size: 13px;">\
<div class="line">\
<span style="text-align: right;display: inline-block;position: absolute;">Site: </span>\
'+_site_ul+'\
</div>\
<div class="line c7">The checked site would used the format.</div>\
</div>',
success: function(index, layero) {
$('.nginx-add-site').on('click', '.format-site-list li', function (e) {
if ($(this).find('.bt_checkbox_groups').hasClass('active')) {
$(this).find('.bt_checkbox_groups').removeClass('active');
} else {
$(this).find('.bt_checkbox_groups').addClass('active');
}
});
},
yes: function(index, layero) {
var sites = [];
$(".nginx-add-site .format-site-list .bt_checkbox_groups.active").each(function(){
sites.push($(this).attr("data-val"));
});
var format_data = {
"log_format_name": log_format_name,
"sites": JSON.stringify(sites)
}
bt.send('set_httpd_format_log_to_website', 'config/set_httpd_format_log_to_website', format_data, function(res) {
layer.close(index);
if(res.status) $('.bt-soft-menu p:contains("Logs format")').click();
layer.msg(res.msg, {icon: res.status ? 1 : 2});
})
}
})
});
});
});
});
break;
case 'apache_status':
var loadT = bt.load();
bt.send('GetApacheStatus', 'ajax/GetApacheStatus', {}, function(rdata) {
loadT.close();
$(".soft-man-con").html("<div><table id='tab-Apache-status' class='table table-hover table-bordered'> </table></div>");
var arrs = []
arrs[lan.bt.apache_uptime] = rdata.UpTime;
arrs[lan.bt.apache_idleworkers] = rdata.IdleWorkers;
arrs[lan.bt.apache_totalaccesses] = rdata.TotalAccesses;
arrs[lan.bt.apache_totalkbytes] = rdata.TotalKBytes;
arrs[lan.bt.apache_workermem] = rdata.workermem;
arrs[lan.bt.apache_workercpu] = rdata.workercpu;
arrs[lan.bt.apache_reqpersec] = rdata.ReqPerSec;
arrs[lan.bt.apache_restarttime] = rdata.RestartTime;
arrs[lan.bt.apache_busyworkers] = rdata.BusyWorkers;
bt.render_table("tab-Apache-status", arrs);
})
break;
case 'nginx_set':
var loadT = bt.load();
bt.send('GetNginxValue', 'config/GetNginxValue', {}, function(rdata) {
loadT.close();
var form_datas = []
for (var i = 0; i < rdata.length; i++) {
if (rdata[i].name == 'worker_processes') {
form_datas.push({
title: rdata[i].name,
name: rdata[i].name,
width: '60px',
value: rdata[i].value,
ps: rdata[i].ps,
text: ''
})
} else if (rdata[i].name == 'gzip') {
form_datas.push({
title: rdata[i].name,
type: 'select',
items: [{
title: lan.soft.on,
value: 'on'
}, {
title: lan.soft.off,
value: 'off'
}],
name: rdata[i].name,
width: '60px',
value: rdata[i].value,
ps: rdata[i].ps,
text: ''
})
} else {
form_datas.push({
title: rdata[i].name,
type: 'number',
name: rdata[i].name,
width: '60px',
value: rdata[i].value,
ps: rdata[i].ps,
text: ''
})
}
}
form_datas.push({
items: [{
text: lan.public.save,
type: 'button',
name: 'bt_nginx_save',
callback: function(item) {
delete item['bt_nginx_save']
bt.send('SetNginxValue', 'config/SetNginxValue', item, function(rdata) {
layer.msg(rdata.msg, {
icon: rdata.status ? 1 : 2
});
});
}
}]
})
$(".soft-man-con").empty().append('<div class="set_nginx_config"></div>');
for (var i = 0; i < form_datas.length; i++) {
bt.render_form_line(form_datas[i], '', $(".soft-man-con .set_nginx_config"));
}
});
break;
case 'apache_set':
var loadT = bt.load();
bt.send('GetNginxValue', 'config/GetApacheValue', {}, function(rdata) {
loadT.close();
var form_datas = []
for (var i = 0; i < rdata.length; i++) {
if (rdata[i].name == 'KeepAlive') {
form_datas.push({
title: rdata[i].name,
type: 'select',
items: [{
title: lan.soft.on,
value: 'on'
}, {
title: lan.soft.off,
value: 'off'
}],
name: rdata[i].name,
width: '65px',
value: rdata[i].value,
ps: rdata[i].ps,
text: ''
})
} else {
form_datas.push({
title: rdata[i].name,
type: 'number',
name: rdata[i].name,
width: '65px',
value: rdata[i].value,
ps: rdata[i].ps,
text: ''
})
}
}
form_datas.push({
items: [{
text: lan.public.save,
type: 'button',
name: 'bt_apache_save',
callback: function(item) {
delete item['bt_apache_save'];
bt.send('SetApacheValue', 'config/SetApacheValue', item, function(rdata) {
layer.msg(rdata.msg, {
icon: rdata.status ? 1 : 2
});
});
}
}]
})
$(".soft-man-con").empty().append('<div class="set_Apache_config"></div>');
for (var i = 0; i < form_datas.length; i++) {
bt.render_form_line(form_datas[i], '', $(".soft-man-con .set_Apache_config"));
}
});
break;
case 'memcached_status':
case 'memcached_set':
var loadT = bt.load(lan.public.get_the);
bt.send('GetMemcachedStatus', 'ajax/GetMemcachedStatus', {}, function(rdata) {
loadT.close();
if (key == 'memcached_set') {
var form_data = [{
title: 'BindIP',
name: 'ip',
width: '120px',
value: rdata.bind,
ps: lan.soft.listen_ip_tips
},
{
title: 'PORT',
name: 'port',
type: 'number',
width: '120px',
value: rdata.port,
ps: lan.soft.listen_port_tips
},
{
title: 'CACHESIZE',
name: 'cachesize',
type: 'number',
width: '120px',
value: rdata.cachesize,
ps: lan.soft.cache_size
},
{
title: 'MAXCONN',
name: 'maxconn',
type: 'number',
width: '120px',
value: rdata.maxconn,
ps: lan.soft.mac_connect
},
{
title: ' ',
items: [{
text: lan.public.save,
name: 'btn_set_memcached',
type: 'button',
callback: function(ldata) {
if (ldata.ip.split('.').length < 4) {
layer.msg(lan.soft.ip_format_err, {
icon: 2
});
return;
}
if (ldata.port < 1 || ldata.port > 65535) {
layer.msg(lan.soft.port_range_err, {
icon: 2
});
return;
}
if (ldata.cachesize < 8) {
layer.msg(lan.soft.cache_too_small, {
icon: 2
});
return;
}
if (ldata.maxconn < 4) {
layer.msg(lan.soft.connect_too_small, {
icon: 2
});
return;
}
var loadT = bt.load(lan.public.the);
bt.send('SetMemcachedCache', 'ajax/SetMemcachedCache', ldata, function(rdata) {
loadT.close();
bt.msg(rdata)
});
}
}]
}
]
var tabCon = $(".soft-man-con").empty();
for (var i = 0; i < form_data.length; i++) {
bt.render_form_line(form_data[i], '', tabCon);
}
return;
} else {
var arr = {};
arr['BindIP'] = [rdata.bind, lan.soft.listen_ip];
arr['PORT'] = [rdata.port, lan.soft.listen_port];
arr['CACHESIZE'] = [rdata.cachesize + ' MB', lan.soft.max_cache];
arr['MAXCONN'] = [rdata.maxconn, lan.soft.max_connect_limit];
arr['curr_connections'] = [rdata.curr_connections, lan.soft.curr_connect];
arr['cmd_get'] = [rdata.cmd_get, lan.soft.get_request_num];
arr['get_hits'] = [rdata.get_hits, lan.soft.get_hit_num];
arr['get_misses'] = [rdata.get_misses, lan.soft.get_miss_num];
arr['hit'] = [rdata.hit.toFixed(2) + ' %', lan.soft.get_hit_percent];
arr['curr_items'] = [rdata.curr_items, lan.soft.curr_cache_rows];
arr['evictions'] = [rdata.evictions, lan.soft.mem_not_enough];
arr['bytes'] = [ToSize(rdata.bytes), lan.soft.curr_mem_use];
arr['bytes_read'] = [ToSize(rdata.bytes_read), lan.soft.request_size_total];
arr['bytes_written'] = [ToSize(rdata.bytes_written), lan.soft.send_size_total];
var con = "<div class=\"divtable\"><table id='tab_memcached_status' style=\"width: 600px;\" class='table table-hover table-bordered '><thead><th>" + lan.soft.field + "</th><th>" + lan.soft.curr_val + "</th><th>" + lan.soft.instructions + "</th></thead></table></div>";
$(".soft-man-con").html(con);
bt.render_table('tab_memcached_status', arr, true);
}
})
break;
case 'phpmyadmin_php':
bt.send('GetPHPVersion', 'site/GetPHPVersion', {}, function(rdata) {
var sdata = $('.bt-soft-menu').data('data');
var body = "<div class='ver line'><span class='tname' style='text-align: center;'>" + lan.soft.php_version + "</span><select id='get_phpVersion' class='bt-input-text mr20' name='phpVersion' style='width:110px'>";
for (var i = 0; i < rdata.length; i++) {
optionSelect = rdata[i].version == sdata.ext.phpversion ? 'selected' : '';
body += "<option value='" + rdata[i].version + "' " + optionSelect + ">" + rdata[i].name + "</option>"
}
body += '</select><button class="btn btn-success btn-sm" >' + lan.public.save + '</button></div>';
$(".soft-man-con").html(body);
$('.btn-success').click(function() {
var loadT = bt.load(lan.public.the);
bt.send('setPHPMyAdmin', 'ajax/setPHPMyAdmin', {
phpversion: $("#get_phpVersion").val()
}, function(rdata) {
loadT.close();
bt.msg(rdata);
if (rdata.status) {
setTimeout(function() {
window.location.reload();
}, 3000);
}
})
})
})
break;
case 'phpmyadmin_safe':
var sdata = $('.bt-soft-menu').data('data'),
sslPortNum = '';
var con = '<div class="ver line user_set_info">\
<span class="tit">' + lan.soft.pma_port + '</span>\
<input class="bt-input-text phpmyadmindk mr20" name="Name" id="pmport" value="' + sdata.ext.port + '" placeholder="' + lan.soft.pma_port_title + '" maxlength="5" type="number">\
<button class="btn btn-success btn-sm phpmyadmin_port" >' + lan.public.save + '</button>\
</div>\
<div class="ver line user_set_info" style="margin-top: 30px;padding-top: 30px;border-top: #ccc 1px dashed;">\
<span class="tit">Open SSL</span>\
<span class="btswitch-p"><input class="btswitch btswitch-ios" id="ssl_safe_checkbox" type="checkbox">\
<label class="btswitch-btn phpmyadmin-btn ssl_safe_label" for="ssl_safe_checkbox" style="margin:0px" ></label>\
</span>\
</div>\
<div class="ver line user_set_info">\
<span class="tit">SSL port</span>\
<input class="bt-input-text ssl_port_input mr20" name="Name" id="sslport" value="" maxlength="5" type="number">\
<button class="btn btn-success btn-sm ssl_port_button" >Save</button>\
</div>\
<div class="user_pw_tit">\
<span class="tit" style="width: 160px;padding-right: 20px;">' + lan.soft.pma_pass + '</span>\
<span class="btswitch-p"><input class="btswitch btswitch-ios" id="phpmyadminsafe" type="checkbox" ' + (sdata.ext.auth ? 'checked' : '') + '>\
<label class="btswitch-btn phpmyadmin-btn phpmyadmin_safe" for="phpmyadminsafe" ></label>\
</span>\
</div>\
<div class="user_pw" style="margin-top:5px;">\
<p><span style="width: 160px;padding-right: 20px;">' + lan.soft.pma_user + '</span><input id="username_get" class="bt-input-text" name="username_get" value="" type="text" placeholder="' + lan.soft.edit_empty + '"></p>\
<p><span style="width: 160px;padding-right: 20px;">' + lan.soft.pma_pass1 + '</span><input id="password_get_1" class="bt-input-text" name="password_get_1" value="" type="password" placeholder="' + lan.soft.edit_empty + '"></p>\
<p><span style="width: 160px;padding-right: 20px;">' + lan.soft.pma_pass2 + '</span><input id="password_get_2" class="bt-input-text" name="password_get_1" value="" type="password" placeholder="' + lan.soft.edit_empty + '"></p>\
<p><button class="btn btn-success btn-sm phpmyadmin_safe_save" style="margin-left:160px;">' + lan.public.save + '</button></p>\
</div>\
<ul class="help-info-text c7"><li>' + lan.soft.pma_ps + '</li></ul>';
$(".soft-man-con").html(con);
if (sdata.ext.port) {
$(".user_pw").show();
}
function get_phpmyadmin_ssl() {
var loading = bt.load('Getting SSL Status...');
bt.send('get_phpmyadmin_ssl', 'ajax/get_phpmyadmin_ssl', {}, function(tdata) {
loading.close();
$('#ssl_safe_checkbox').prop("checked", tdata.status);
$('#sslport').val(tdata.port)
})
}
get_phpmyadmin_ssl()
$('.phpmyadmin_port').click(function() {
var pmport = $("#pmport").val();
var loadT = bt.load(lan.public.the);
bt.send('setPHPMyAdmin', 'ajax/setPHPMyAdmin', {
port: pmport
}, function(rdata) {
loadT.close();
bt.msg(rdata);
})
})
$('.ssl_safe_label').click(function() {
var stat = $('#ssl_safe_checkbox').prop("checked");
bt.send('set_phpmyadmin_ssl', 'ajax/set_phpmyadmin_ssl', {
v: !stat ? 1 : 0
}, function(rdata) {
bt.msg(rdata)
})
setTimeout(function() {
get_phpmyadmin_ssl();
}, 500)
})
$('.ssl_port_button').click(function() {
var sslPort = $('#sslport').val();
if (!bt.check_port(sslPort)) {
layer.msg(lan.firewall.port_err, {
icon: 2
});
return;
}
var loadTo = bt.load(lan.public.the);
if (sslPort > 0) {
bt.send('change_phpmyadmin_ssl_port', 'ajax/change_phpmyadmin_ssl_port', {
port: sslPort
}, function(rdata) {
loadTo.close();
bt.msg(rdata);
})
}
})
$('.phpmyadmin_safe').click(function() {
var stat = $("#phpmyadminsafe").prop("checked");
if (stat) {
$(".user_pw").hide();
set_phpmyadmin('close');
} else {
$(".user_pw").show();
}
})
$('.phpmyadmin_safe_save').click(function() {
set_phpmyadmin('get');
})
function set_phpmyadmin(msg) {
var type = 'password';
if (msg == 'close') {
bt.confirm({
msg: lan.soft.pma_pass_close
}, function() {
var loading = bt.load(lan.public.the);
bt.send('setPHPMyAdmin', 'ajax/setPHPMyAdmin', {
password: msg,
siteName: 'phpmyadmin'
}, function(rdata) {
loading.close();
bt.msg(rdata);
})
})
return;
} else {
username = $("#username_get").val()
password_1 = $("#password_get_1").val()
password_2 = $("#password_get_2").val()
if (username.length < 1 || password_1.length < 1) {
bt.msg({
msg: lan.soft.pma_pass_empty,
icon: 2
})
return;
}
if (password_1 != password_2) {
bt.msg({
msg: lan.soft.pass_err_re,
icon: 2
})
return;
}
}
var loading = bt.load(lan.public.the);
bt.send('setPHPMyAdmin', 'ajax/setPHPMyAdmin', {
password: password_1,
username: username,
siteName: 'phpmyadmin'
}, function(rdata) {
loading.close();
bt.msg(rdata);
setTimeout(function () {
location.reload();
}, 1000);
})
}
break;
case 'set_php_config':
if (!obj.notLoading) var loading = bt.load(lan.public.the);
bt.soft.php.get_config(version, function(rdata) {
if (!obj.notLoading) loading.close();
obj.notLoading = false;
var divObj = document.getElementById('phpextdiv');
var scrollTopNum = 0;
if (divObj) scrollTopNum = divObj.scrollTop;
$(".soft-man-con").empty().append('<div class="divtable" id="phpextdiv" style="height: 478px; overflow: auto;padding-bottom: 1px;margin-bottom: 25px;"><table id="tab_phpext" class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0"></div></div>');
var list = [];
for (var i = 0; i < rdata.libs.length; i++) {
if (rdata.libs[i].versions.indexOf(version) == -1) continue;
list.push(rdata.libs[i]);
}
var _tab = bt.render({
table: '#tab_phpext',
data: list,
columns: [{
field: 'name',
title: lan.soft.php_ext_name
},
{
field: 'type',
title: lan.soft.php_ext_type,
width: 64
},
{
field: 'msg',
title: lan.soft.php_ext_ps
},
{
field: 'status',
title: lan.soft.php_ext_status,
width: 40,
templet: function(item) {
return '<span class="ico-' + (item.status ? 'start' : 'stop') + ' glyphicon glyphicon-' + (item.status ? 'ok' : 'remove') + '"></span>'
}
},
{
field: 'opt',
title: lan.public.action,
width: 60,
templet: function(item) {
var opt = '<a class="btlink lib-install" data-name="' + item.name + '" data-title="' + item.title + '" href="javascript:;">' + lan.soft.install + '</a>'
if (item['task'] == '-1' && item.phpversions.indexOf(version) != -1) {
opt = '<a style="color:green;" href="javascript:messagebox();">' + lan.soft.the_install + '</a>'
} else if (item['task'] == '0' && item.phpversions.indexOf(version) != -1) {
opt = '<a style="color:#C0C0C0;" href="javascript:messagebox();">' + lan.soft.sleep_install + '</a>'
} else if (item.status) {
opt = '<a style="color:red;" data-name="' + item.name + '" data-title="' + item.title + '" class="lib-uninstall" href="javascript:;">' + lan.soft.uninstall + '</a>'
}
return opt;
}
},
]
})
var helps = [lan.soft.php_plug_tips1, lan.soft.php_plug_tips2]
$(".soft-man-con").append(bt.render_help(helps));
var divObj = document.getElementById('phpextdiv');
if (divObj) divObj.scrollTop = scrollTopNum;
$('a').click(function() {
var _obj = $(this);
if (_obj.hasClass('lib-uninstall')) {
bt.soft.php.un_install_php_lib(version, _obj.attr('data-name'), _obj.attr('data-title'), function(rdata) {
setTimeout(function() {
soft.get_tab_contents('set_php_config', obj);
}, 1000)
});
} else if (_obj.hasClass('lib-install')) {
bt.soft.php.install_php_lib(version, _obj.attr('data-name'), _obj.attr('data-title'), function(rdata) {
setTimeout(function() {
soft.get_tab_contents('set_php_config', obj);
}, 1000)
});
}
})
setTimeout(function() {
if ($(".bt-soft-menu .bgw").text() === 'Install extensions') {
obj.notLoading = true;
soft.get_tab_contents('set_php_config', obj);
}
}, 3000)
})
break;
case 'get_phpinfo':
var con = '';
var p_status = {
true: '<span style="color:green;">Yes</span>',
false: '<span style="color:red;">No</span>'
};
var loading = bt.load(lan.public.the);
$.post('/ajax?action=php_info', {
php_version: version
}, function(php_info) {
loading.close();
con += '<button id="btn_phpinfo" class="btn btn-default btn-sm" >' + lan.soft.phpinfo + '</button>'
con += '<div class="php_info_group"><p>' + lan.soft.php_base_info + ' </p>'
con += '<table id="tab_php_status" class="table table-hover table-bordered" style="margin:0;padding:0">';
con += '<tr><td>' + lan.soft.version + '</td><td>' + php_info.phpinfo.php_version + '</td><td>' + lan.soft.install_path + '</td><td>' + php_info.phpinfo.php_path + '</td></tr>'
con += '<tr><td>php.ini</td><td colspan="3">' + php_info.phpinfo.php_ini + '</td></tr>'
con += '<tr><td>' + lan.soft.loaded + '</td><td colspan="3">' + php_info.phpinfo.modules + '</td></tr>'
con += '</table></div>';
Object.keys(php_info).sort().forEach(function(k) {
if (k !== 'phpinfo') {
con += '<div class="php_info_group"><p>' + php_info.phpinfo.keys[k] + '</p>'
con += '<table id="tab_php_status" class="table table-hover table-bordered" style="margin:0;padding:0">';
var nkey = 0;
Object.keys(php_info[k]).forEach(function(key) {
if (nkey == 0) con += '<tr>';
con += '<td>' + key + '</td><td>' + p_status[php_info[k][key]] + '</td>'
nkey++;
if (nkey >= 3) {
nkey = 0;
con += '</tr>';
}
});
con += '</table></div>';
}
})
$(".soft-man-con").html(con);
$('#btn_phpinfo').click(function() {
var loadT = bt.load(lan.soft.get);
bt.send('GetPHPInfo', 'ajax/GetPHPInfo', {
version: version
}, function(rdata) {
loadT.close();
var content = rdata.replace('a:link {color: #009; text-decoration: none; background-color: #fff;}', '').replace('a:link {color: #000099; text-decoration: none; background-color: #ffffff;}', '');
bt.open({
type: 1,
title: "PHP-" + version + "-PHPINFO",
area: ['73%', '90%'],
closeBtn: 2,
shadeClose: true,
content: '<div style="white-space: pre-wrap;padding:0 10px;">'+content+'</div>'
})
})
})
});
break;
case 'config_edit':
bt.soft.php.get_php_config(version, function(rdata) {
var mlist = '';
for (var i = 0; i < rdata.length; i++) {
var w = '70'
if (rdata[i].name == 'error_reporting') w = '250';
var ibody = '<input style="width: ' + w + 'px;" class="bt-input-text mr5" name="' + rdata[i].name + '" value="' + rdata[i].value + '" type="text" >';
switch (rdata[i].type) {
case 0:
var selected_1 = (rdata[i].value == 1) ? 'selected' : '';
var selected_0 = (rdata[i].value == 0) ? 'selected' : '';
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;"><option value="1" ' + selected_1 + '>' + lan.soft.on + '</option><option value="0" ' + selected_0 + '>' + lan.soft.off + '</option></select>'
break;
case 1:
var selected_1 = (rdata[i].value == 'On') ? 'selected' : '';
var selected_0 = (rdata[i].value == 'Off') ? 'selected' : '';
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;"><option value="On" ' + selected_1 + '>' + lan.soft.on + '</option><option value="Off" ' + selected_0 + '>' + lan.soft.off + '</option></select>'
break;
}
mlist += '<p><span>' + rdata[i].name + '</span>' + ibody + ', <font>' + rdata[i].ps + '</font></p>'
}
var tabCon = $(".soft-man-con").empty()
tabCon.append('<div class="conf_p">' + mlist + '</div></div>')
var datas = {
title: ' ',
items: [{
name: 'btn_fresh',
text: lan.public.fresh,
type: 'button',
callback: function(ldata) {
soft.get_tab_contents(key, obj);
}
},
{
name: 'btn_save',
text: lan.public.save,
type: 'button',
callback: function(ldata) {
var loadT = bt.load();
ldata['version'] = version;
bt.send('SetPHPConf', 'config/SetPHPConf', ldata, function(rdata) {
loadT.close();
soft.get_tab_contents(key, obj);
bt.msg(rdata)
});
}
}
]
}
var _form_data = bt.render_form_line(datas);
$('.conf_p').append(_form_data.html)
bt.render_clicks(_form_data.clicks);
$(".conf_p > .line").css("margin-top","25px");
});
break;
case 'set_upload_limit':
bt.soft.php.get_limit_config(version, function(ret) {
var datas = [{
items: [{
title: '',
type: 'number',
width: '100px',
value: ret.max,
unit: 'MB',
name: 'phpUploadLimit'
},
{
name: 'btn_limit_get',
text: lan.public.save,
type: 'button',
callback: function(ldata) {
var max = ldata.phpUploadLimit;
if (max < 2) {
layer.msg(lan.soft.php_upload_size, {
icon: 2
});
return;
}
bt.soft.php.set_upload_max(version, max, function(rdata) {
if (rdata.status) {
soft.get_tab_contents(key, obj);
}
bt.msg(rdata);
})
}
}
]
}]
var clicks = [];
var tabCon = $(".soft-man-con").empty().append("<div class='set_upload_limit'></div>")
for (var i = 0; i < datas.length; i++) {
var _form_data = bt.render_form_line(datas[i]);
$('.set_upload_limit').append(_form_data.html);
clicks = clicks.concat(_form_data.clicks);
}
bt.render_clicks(clicks);
})
break;
case 'set_timeout_limit':
bt.soft.php.get_limit_config(version, function(ret) {
var datas = [{
items: [{
title: '',
type: 'number',
width: '100px',
value: ret.maxTime,
name: 'phpTimeLimit',
unit: 'Sec'
},
{
name: 'btn_limit_get',
text: lan.public.save,
type: 'button',
callback: function(ldata) {
var max = ldata.phpTimeLimit;
bt.soft.php.set_php_timeout(version, max, function(rdata) {
if (rdata.status) {
soft.get_tab_contents(key, obj);
}
bt.msg(rdata);
})
}
}
]
}]
var clicks = [];
var tabCon = $(".soft-man-con").empty().append("<div class='set_timeout_limit bt-form'></div>")
for (var i = 0; i < datas.length; i++) {
var _form_data = bt.render_form_line(datas[i]);
$('.set_timeout_limit').append(_form_data.html);
clicks = clicks.concat(_form_data.clicks);
}
bt.render_clicks(clicks);
})
break;
case 'set_dis_fun':
var loading = bt.load(lan.public.the);
bt.soft.php.get_config(version, function(rdata) {
loading.close();
var list = [];
var disable_functions = rdata.disable_functions.split(',');
for (var i = 0; i < disable_functions.length; i++) {
if (disable_functions[i] == '') continue;
list.push({
name: disable_functions[i]
})
}
var _bt_form = $("<div class='bt-form' style='height:560px;'></div>")
var tabCon = $(".soft-man-con").empty().append(_bt_form);
var _line = bt.render_form_line({
title: '',
items: [{
name: 'disable_function_val',
placeholder: lan.soft.fun_ps1,
width: '410px'
},
{
name: 'btn_disable_function_val',
text: lan.public.save,
type: 'button',
callback: function(ldata) {
var disable_functions = rdata.disable_functions.split(',')
if ($.inArray(ldata.disable_function_val, disable_functions) >= 0) {
bt.msg({
msg: lan.soft.fun_msg,
icon: 5
});
return;
}
disable_functions.push(ldata.disable_function_val);
set_disable_functions(version, disable_functions.join(','))
}
}
]
}, '', _bt_form)
bt.render_clicks(_line.clicks);
_bt_form.append("<div class='divtable mtb15' style='height:500px;overflow:auto'><table id=\"blacktable\" class='table table-hover' width='100%' style='margin-bottom:0'></table><div>")
var _tab = bt.render({
table: '#blacktable',
data: list,
columns: [{
field: 'name',
title: lan.soft.php_ext_name
},
{
field: 'opt',
title: lan.public.action,
width: 50,
templet: function(item) {
var new_disable_functions = disable_functions.slice()
new_disable_functions.splice($.inArray(item.name, new_disable_functions), 1)
return '<a class="del_functions" style="color: #20a53a;" data-val="shell_exec" onclick="set_disable_functions(\'' + version + '\',\'' + new_disable_functions.join(',') + '\')" href="javascript:;">' + lan.soft.del + '</a>';
}
}
]
})
tabCon.append(bt.render_help([lan.soft.fun_ps2, lan.soft.fun_ps3]));
})
break;
case 'set_fpm_config':
bt.soft.php.get_fpm_config(version, function(rdata) {
var datas = {
'1GB Ram': {
max_children: 30,
start_servers: 5,
min_spare_servers: 5,
max_spare_servers: 20
},
'2GB Ram': {
max_children: 50,
start_servers: 5,
min_spare_servers: 5,
max_spare_servers: 30
},
'4GB Ram': {
max_children: 80,
start_servers: 10,
min_spare_servers: 10,
max_spare_servers: 30
},
'8GB Ram': {
max_children: 120,
start_servers: 10,
min_spare_servers: 10,
max_spare_servers: 30
},
'16GB Ram': {
max_children: 200,
start_servers: 15,
min_spare_servers: 15,
max_spare_servers: 50
},
'32GB Ram': {
max_children: 300,
start_servers: 20,
min_spare_servers: 20,
max_spare_servers: 50
}
}
var limits = [],
pmList = [];
var my_selected = '';
var num_max = Number(rdata.max_children);
for (var k in datas) {
if (datas[k].max_children === num_max) {
my_selected = k;
}
limits.push({
title: k,
value: k
});
}
var _form_datas = [{
title: lan.soft.concurrency_type,
name: 'limit',
value: my_selected,
type: 'select',
items: limits,
callback: function(iKey) {
var item = datas[iKey.val()]
for (var sk in item) $('.' + sk).val(item[sk]);
}
},
{
title: 'Connection',
name: 'listen',
value: rdata.unix,
type: 'select',
items: [
{ title: 'UNIX socket', value: 'unix' },
{ title: 'TCP socket', value: 'tcp' }
],
ps: '* UNIX socket recommended'
},
{
title: lan.soft.php_fpm_model,
name: 'pm',
value: rdata.pm,
type: 'select',
items: [{
title: lan.bt.static,
value: 'static'
},
{
title: lan.bt.dynamic,
value: 'dynamic'
},
{ title:'On-demand', value: 'ondemand' }
],
ps: '*' + lan.soft.php_fpm_ps1
},
{
title: 'max_children',
name: 'max_children',
value: rdata.max_children,
type: 'number',
width: '100px',
ps: '*' + lan.soft.php_fpm_ps2
},
{
title: 'start_servers',
name: 'start_servers',
value: rdata.start_servers,
type: 'number',
width: '100px',
ps: '*' + lan.soft.php_fpm_ps3
},
{
title: 'min_spare_servers',
name: 'min_spare_servers',
value: rdata.min_spare_servers,
type: 'number',
width: '100px',
ps: '*' + lan.soft.php_fpm_ps4
},
{
title: 'max_spare_servers',
name: 'max_spare_servers',
value: rdata.max_spare_servers,
type: 'number',
width: '100px',
ps: '*' + lan.soft.php_fpm_ps5
},
{
title: ' ',
text: lan.public.save,
name: 'btn_children_submit',
css: 'btn-success',
type: 'button',
callback: function(ldata) {
bt.pub.get_menm(function(memInfo) {
var limit_children = parseInt(memInfo['memTotal'] / 8);
if (limit_children < parseInt(ldata.max_children)) {
layer.msg(lan.soft.php_child_process.replace('{1}', limit_children), {
icon: 2
});
$("input[name='max_children']").focus();
return;
}
if (parseInt(ldata.max_children) < parseInt(ldata.max_spare_servers)) {
layer.msg(lan.soft.php_fpm_err1, {
icon: 2
});
return;
}
if (parseInt(ldata.min_spare_servers) > parseInt(ldata.start_servers)) {
layer.msg(lan.soft.php_fpm_err2, {
icon: 2
});
return;
}
if (parseInt(ldata.max_spare_servers) < parseInt(ldata.min_spare_servers)) {
layer.msg(lan.soft.php_fpm_err3, {
icon: 2
});
return;
}
if (parseInt(ldata.max_children) < parseInt(ldata.start_servers)) {
layer.msg(lan.soft.php_fpm_err4, {
icon: 2
});
return;
}
if (parseInt(ldata.max_children) < 1 || parseInt(ldata.start_servers) < 1 || parseInt(ldata.min_spare_servers) < 1 || parseInt(ldata.max_spare_servers) < 1) {
layer.msg(lan.soft.php_fpm_err5, {
icon: 2
});
return;
}
ldata['version'] = version;
bt.soft.php.set_fpm_config(version, ldata, function(rdata) {
soft.get_tab_contents(key, obj);
bt.msg(rdata);
})
})
}
}
]
var tabCon = $(".soft-man-con").empty()
var _c_form = $('<div class="bt-form php-limit-config"></div >')
var clicks = [];
for (var i = 0; i < _form_datas.length; i++) {
var _form = bt.render_form_line(_form_datas[i]);
_c_form.append(_form.html)
clicks = clicks.concat(_form.clicks);
}
_c_form.append('<ul class="help-info-text c7">\
<li>[Max num of child processes] The larger the number, the stronger the concurrency,<br>&nbsp;&nbsp;&nbsp;&nbsp; but max_children should not exceed 5000.</li>\
<li>[Ram] Each PHP child process needs about 20MB of Ram,<br>&nbsp;&nbsp;&nbsp;&nbsp; too large max_children will cause server instability.</li>\
<li>[Static mode] In the static mode, the set number of child processes is always maintained,<br>&nbsp;&nbsp;&nbsp;&nbsp; which has a large Ram overhead, but has a good concurrency capability.</li>\
<li>[Dynamic mode] will recover the process according to the set max number of idle processes,<br>&nbsp;&nbsp;&nbsp;&nbsp; the Ram overhead is small, it is recommended to use a small Ram machine.</li>\
<li>[64GB Ram recommended value] max_children <= 1000, start / min_spare = 50, max_spare <= 200</li>\
<li>[Multi-PHP Version] If you have installed multiple PHP versions and are using them,<br>&nbsp;&nbsp;&nbsp;&nbsp; it is recommended to reduce the concurrent configuration appropriately.</li>\
<li>[No database] If no database such as mysql is installed,<br>&nbsp;&nbsp;&nbsp;&nbsp; it is recommended to set 2 times the recommended concurrency.</li>\
<li>[Note] The above are the recommended configuration instructions.<br>&nbsp;&nbsp;&nbsp;&nbsp; The online projects are complex and diverse. Please adjust according to actual conditions.</li>\
</ul>')
tabCon.append(_c_form);
bt.render_clicks(clicks);
});
break;
case 'get_php_status':
bt.soft.php.get_php_status(version, function(rdata) {
var arr = {};
arr[lan.bt.php_pool] = rdata.pool;
arr[lan.bt.php_manager] = ((rdata['process manager'] == 'dynamic') ? lan.bt.dynamic : lan.bt.static);
arr[lan.bt.php_start] = rdata['start time'];
arr[lan.bt.php_accepted] = rdata['accepted conn'];
arr[lan.bt.php_queue] = rdata['listen queue'];
arr[lan.bt.php_max_queue] = rdata['max listen queue'];
arr[lan.bt.php_len_queue] = rdata['listen queue len'];
arr[lan.bt.php_idle] = rdata['idle processes'];
arr[lan.bt.php_active] = rdata['active processes'];
arr[lan.bt.php_total] = rdata['total processes'];
arr[lan.bt.php_max_active] = rdata['max active processes'];
arr[lan.bt.php_max_children] = rdata['max children reached'];
arr[lan.bt.php_slow] = rdata['slow requests'];
var con = "<div style='overflow:auto;'><table id='tab_php_status' class='table table-hover table-bordered' style='margin:0;padding:0'></table></div>";
$(".soft-man-con").html(con);
bt.render_table('tab_php_status', arr);
})
break;
case 'get_php_session':
bt.soft.php.get_php_session(version, function(res) {
$(".soft-man-con").html('<div class="conf_p">' +
'<div class="line ">' +
'<span class="tname">' + lan.soft.storage_mode + '</span>' +
'<div class="info-r ">' +
'<select class="bt-input-text mr5 change_select_session" name="save_handler" style="width:160px">' +
'<option value="files" ' + (res.save_handler == 'files' ? 'selected' : '') + '>files</option>' +
(version != '52' ? '<option value="redis" ' + (res.save_handler == 'redis' ? 'selected' : '') + '>redis</option>' : '') +
(version != '73' ? '<option value="memcache" ' + (res.save_handler == 'memcache' ? 'selected' : '') + '>memcache</option>' : '') +
'<option value="memcached" ' + (res.save_handler == 'memcached' ? 'selected' : '') + '>memcached</option>' +
'</select>' +
'</div>' +
'</div>' +
'<div class="line">' +
'<span class="tname">' + lan.soft.ip_addr + '</span>' +
'<div class="info-r ">' +
'<input name="ip" class="bt-input-text mr5" type="text" style="width:180px" value="' + res.save_path + '">' +
'</div>' +
'</div>' +
'<div class="line">' +
'<span class="tname">' + lan.soft.port + '</span>' +
'<div class="info-r ">' +
'<input name="port" class="bt-input-text mr5" type="text" style="width:180px" value="' + res.port + '">' +
'</div>' +
'</div>' +
'<div class="line">' +
'<span class="tname">' + lan.soft.passwd + '</span>' +
'<div class="info-r ">' +
'<input name="passwd" class="bt-input-text mr5" placeholder="' + lan.soft.no_passwd_set_empty + '" type="text" style="width:180px" value="' + res.passwd + '">' +
'</div>' +
'</div>' +
'<div class="line">' +
'<button name="btn_save" class="btn btn-success btn-sm mr5 ml5 btn_conf_save" style="margin-left: 135px;">' + lan.soft.save + '</button>' +
'</div>' +
'<ul class="help-info-text c7">' +
'<li>' + lan.soft.php_seesion_tips1 + '</li>' +
'<li>' + lan.soft.php_seesion_tips2 + '</li>' +
'<li>' + lan.soft.php_seesion_tips3 + '</li>' +
'</ul>' +
'<div class="session_clear" style="border-top: #ccc 1px dashed;padding-top: 15px;margin-top: 15px;">' +
'<div class="clear_title" style="padding-bottom:15px;">' + lan.soft.clear_seesion_files + '</div><div class="clear_conter"></div></div>' +
'</div>');
if (res.save_handler == 'files') {
bt.soft.php.get_session_count(function(res) {
$('.clear_conter').html('<div class="session_clear_list"><div class="line"><span>' + lan.soft.total_seesion_files + '</span><span>' + res.total + '</span></div><div class="line"><span>' + lan.soft.can_clear_seesion + '</span><span>' + res.oldfile + '</span></div></div><button class="btn btn-success btn-sm clear_session_file">' + lan.soft.clear_seesion_files + '</button>')
$('.clear_session_file').click(function() {
bt.soft.php.clear_session_count({
title: lan.soft.clear_php_seesion_files,
msg: lan.soft.sure_clear_php_seesion_files
}, function(res) {
layer.msg(res.msg, {
icon: res.status ? 1 : 2
});
setTimeout(function() {
$('.bt-soft-menu p:eq(9)').click();
}, 2000);
});
})
});
} else {
$('.clear_conter').html(lan.soft.only_files_storage_mode_can_clear).attr('style', 'color:#666')
}
switch_type(res.save_handler);
$('.change_select_session').change(function() {
switch_type($(this).val());
switch ($(this).val()) {
case 'redis':
$('[name="ip"]').val('127.0.0.1');
$('[name="port"]').val('6379');
break;
case 'memcache':
$('[name="ip"]').val('127.0.0.1');
$('[name="port"]').val('11211');
break;
case 'memcached':
$('[name="ip"]').val('127.0.0.1');
$('[name="port"]').val('11211');
break;
}
});
$('.btn_conf_save').click(function() {
bt.soft.php.set_php_session({
version: version,
save_handler: $('[name="save_handler"]').val(),
ip: $('[name="ip"]').val(),
port: $('[name="port"]').val(),
passwd: $('[name="passwd"]').val()
}, function(res) {
layer.msg(res.msg, {
icon: res.status ? 1 : 2
});
// setTimeout(function() {
// $('.bt-soft-menu p:eq(9)').click();
// }, 2000);
})
});
function switch_type(type) {
switch (type) {
case 'files':
$('[name="ip"]').attr('disabled', 'disabled').val('');
$('[name="port"]').attr('disabled', 'disabled').val('');
$('[name="passwd"]').attr('disabled', 'disabled').val('');
break;
case 'redis':
$('[name="ip"]').attr('disabled', false);
$('[name="port"]').attr('disabled', false);
$('[name="passwd"]').attr('disabled', false);
break;
case 'memcache':
$('[name="ip"]').attr('disabled', false);
$('[name="port"]').attr('disabled', false);
$('[name="passwd"]').attr('disabled', 'disabled').val('');
break;
case 'memcached':
$('[name="ip"]').attr('disabled', false);
$('[name="port"]').attr('disabled', false);
$('[name="passwd"]').attr('disabled', 'disabled').val('');
break;
}
}
});
break
case 'get_fpm_logs':
bt.soft.php.get_fpm_logs(version, function(logs) {
var phpCon = '<textarea readonly="" style="margin: 0px;width: 600px;height: 620px;background-color: #333;color:#fff; padding:0 5px" id="error_log">' + logs.msg + '</textarea>';
$(".soft-man-con").html(phpCon);
var ob = document.getElementById('error_log');
ob.scrollTop = ob.scrollHeight;
})
break;
case 'get_slow_logs':
bt.soft.php.get_slow_logs(version, function(logs) {
var phpCon = '<textarea readonly="" style="margin: 0px;width: 600px;height: 620px;background-color: #333;color:#fff; padding:0 5px" id="error_log">' + logs.msg + '</textarea>';
$(".soft-man-con").html(phpCon);
var ob = document.getElementById('error_log');
ob.scrollTop = ob.scrollHeight;
})
break;
case 'get_redis_status':
bt.soft.redis.get_redis_status(function(rdata) {
var hit = (parseInt(rdata.keyspace_hits) / (parseInt(rdata.keyspace_hits) + parseInt(rdata.keyspace_misses)) * 100).toFixed(2);
var arrs = [];
arrs['uptime_in_days'] = [rdata.uptime_in_days, lan.soft.run_days];
arrs['tcp_port'] = [rdata.tcp_port, lan.soft.curr_listen_port];
arrs['connected_clients'] = [rdata.connected_clients, lan.soft.connected_clients];
arrs['used_memory_rss'] = [bt.format_size(rdata.used_memory_rss), lan.soft.used_memory_rss];
arrs['used_memory'] = [bt.format_size(rdata.used_memory), lan.soft.used_memory];
arrs['mem_fragmentation_ratio'] = [rdata.mem_fragmentation_ratio, lan.soft.mem_fragmentation_ratio];
arrs['total_connections_received'] = [rdata.total_connections_received, lan.soft.total_connections_received];
arrs['total_commands_processed'] = [rdata.total_commands_processed, lan.soft.total_commands_processed];
arrs['instantaneous_ops_per_sec'] = [rdata.instantaneous_ops_per_sec, lan.soft.instantaneous_ops_per_sec];
arrs['keyspace_hits'] = [rdata.keyspace_hits, lan.soft.keyspace_hits];
arrs['keyspace_misses'] = [rdata.keyspace_misses, lan.soft.keyspace_misses];
arrs['hit'] = [hit, lan.soft.db_his];
arrs['latest_fork_usec'] = [rdata.latest_fork_usec, lan.soft.latest_fork_usec];
var con = "<div class=\"divtable\"><table id='tab_get_redis_status' style=\"width: 490px;\" class='table table-hover table-bordered '><thead><th>" + lan.soft.field + "</th><th>" + lan.soft.curr_val + "</th><th>" + lan.soft.instructions + "</th></thead></table></div>";
$(".soft-man-con").html(con);
bt.render_table('tab_get_redis_status', arrs, true);
})
break;
case 'openliMa_set':
var loadT = bt.load();
$.post('config?action=get_ols_value', function(rdata) {
loadT.close();
var _mlist_data='',
tips_i = 0,
help_tips=['#Enables GZIP/Brotli compression for both static and dynamic responses.',
'#Specifies the level of GZIP compression applied to dynamic content. Ranges from 1 (lowest) to 9 (highest).',
'',
'#Specifies the maximum number of concurrent connections that the server can accept.<br>\
#This includes both plain TCP connections and SSL connections',
'#Specifies the maximum number of concurrent SSL connections the server will accept<br>\
#Since total concurrent SSL and non-SSL connections cannot exceed the limit specified by Max Connections,<br>\
#the actual number of concurrent SSL connections allowed must be lower than this limit.',
'#Specifies the maximum connection idle time (seconds) allowed during processing one request',
'#Specifies the maximum number of requests that can be served through a keep-alive (persistent) session'];
for (var i in rdata) {
var mlist = {title: '',items: []},list = {};
list.name = i;
list.width = '130px';
list.value = rdata[i];
list.type = i=='enableGzipCompress'?'switch':'input';
list.ps_help = help_tips[tips_i];
mlist.items.push(list);
mlist.title = i;
_mlist_data += bt.render_form_line(mlist).html;
tips_i++;
}
var tabCon = $(".soft-man-con").empty();
tabCon.append('<div class="openlite_set">' + _mlist_data + '</div></div>');
var datas = {
title: ' ',
class: 'openlite_button',
items: [{
name: 'btn_fresh',
text: lan.public.fresh,
type: 'button',
callback: function(ldata) {
soft.get_tab_contents(key, obj);
}
},
{
name: 'btn_save',
text: lan.public.save,
type: 'button',
width: '62px',
callback: function(ldata) {
var datal = {},
loadP = bt.load();
delete ldata.btn_fresh;
delete ldata.btn_save;
ldata['enableGzipCompress']=$("#enableGzipCompress").prop('checked')?1:0;
ldata = JSON.stringify(ldata);
datal = { array: ldata };
bt.send('set_ols_value', 'config/set_ols_value', datal, function(res) {
loadP.close();
soft.get_tab_contents(key, obj);
bt.msg(res);
});
}
}
]
}
var _form_data = bt.render_form_line(datas);
$('.openlite_set').append(_form_data.html);
bt.render_clicks(_form_data.clicks);
$('.enableGzipCompress_help').css('margin-left','104px');
$(".openlite_set").on("mouseenter", ".bt-ico-ask", function () {
var idd = $(this).attr('class').split(" ")[1], tip = $(this).attr('tip');
layer.tips(tip, '.' + idd + '', { tips: [1, '#d4d4d4'], time: 0, area: '300px'});
});
$(".openlite_set").on("mouseleave", ".bt-ico-ask", function () {
layer.closeAll('tips');
});
});
break;
}
},
update_zip_open: function() {
$("#update_zip").on("change", function() {
var files = $("#update_zip")[0].files;
if (files.length == 0) {
return;
}
soft.update_zip(files[0]);
$("#update_zip").val('')
});
$("#update_zip").click();
},
update_zip: function(file) {
var formData = new FormData();
formData.append("plugin_zip", file);
$.ajax({
url: "/plugin?action=update_zip",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(data) {
if (data.status === false) {
layer.msg(data.msg, {
icon: 2
});
return;
}
var loadT = layer.open({
type: 1,
area: "500px",
title: lan.soft.install_third_party_apps,
closeBtn: 2,
shift: 5,
shadeClose: false,
content: '<style>\
.install_three_plugin{padding:25px;padding-bottom:70px}\
.plugin_user_info p { font-size: 14px;}\
.plugin_user_info {padding: 15px 30px;line-height: 26px;background: #f5f6fa;border-radius: 5px;border: 1px solid #efefef;}\
.btn-content{text-align: center;margin-top: 25px;}\
</style>\
<div class="bt-form c7 install_three_plugin pb70">\
<div class="plugin_user_info">\
<p><b>' + lan.soft.name + '</b>' + data.title + '</p>\
<p><b>' + lan.soft.version + '</b>' + data.versions + '</p>\
<p><b>' + lan.soft.ps + '</b>' + data.ps + '</p>\
<p><b>' + lan.soft.size + '</b>' + bt.format_size(data.size, true) + '</p>\
<p><b>' + lan.soft.author + '</b>' + data.author + '</p>\
<p><b>' + lan.soft.source + '</b><a class="btlink" href="' + data.home + '" target="_blank">' + data.home + '</a></p>\
</div>\
<ul class="help-info-text c7">\
<li style="color:red;">' + lan.soft.third_party_apps_tips1 + '</li>\
<li>' + lan.soft.third_party_apps_tips2 + '</li>\
<li>' + lan.third_party_apps_tips3 + '</li>\
</ul>\
<div class="bt-form-submit-btn"><button type="button" class="btn btn-sm btn-danger mr5" onclick="layer.closeAll()">' + lan.soft.cancel + '</button><button type="button" class="btn btn-sm btn-success" onclick="soft.input_zip(\'' + data.name + '\',\'' + data.tmp_path + '\')">' + lan.soft.confirm_install + '</button></div>\
</div>'
});
},
error: function(responseStr) {
layer.msg(lan.soft.upload_fail2, {
icon: 2
});
}
});
},
input_zip: function (plugin_name,tmp_path,data) {
bt.soft.show_speed_window({title:'Installing, this may take a few minutes...',status:true},function(){
$.post('/plugin?action=input_zip', { plugin_name: plugin_name, tmp_path: tmp_path }, function (rdata) {
layer.closeAll()
if (rdata.status) {
soft.get_list();
}
setTimeout(function () { layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }) }, 1000);
});
});
}
};
function soft_td_width_auto() {
var thead_width = '',
winWidth = $(window).width();
if (winWidth <= 1370 && winWidth > 1280) {
thead_width = winWidth / 4;
} else if (winWidth <= 1280 && winWidth > 1210) {
thead_width = winWidth / 5;
} else if (winWidth <= 1210) {
thead_width = winWidth / 6;
} else {
thead_width = winWidth / 3.5;
}
//$('#softList thead th:eq(2)').width(thead_width);
$('#softList tbody tr td:nth-child(8n+2)>span').width(thead_width + 75);
}
function set_disable_functions(version, data) {
bt.soft.php.disable_functions(version, data, function(rdata) {
if (rdata.status) {
soft.get_tab_contents('set_dis_fun', $(".bgw"));
}
bt.msg(rdata);
})
}
var openId = add = null;
function AddDeployment(maction) {
if (maction == 1) {
var pdata = 'title=' + $("input[name='title']").val() +
'&dname=' + $("input[name='name']").val() +
'&ps=' + $("input[name='ps']").val() +
'&version=' + $("input[name='version']").val() +
'&rewrite=' + ($("input[name='rewrite']").attr('checked') ? 1 : 0) +
'&shell=' + ($("input[name='shell']").attr('checked') ? 1 : 0) +
'&php=' + $("input[name='php']").val() +
'&md5=' + $("input[name='md5']").val() +
'&download=' + $("input[name='download']").val()
var loadT = layer.msg('Submitting <img src="/static/img/ing.gif">', {
icon: 16,
time: 0,
shade: [0.3, '#000']
});
$.post('/deployment?action=AddPackage', pdata, function(rdata) {
layer.close(loadT);
layer.msg(rdata.msg, {
icon: rdata.status ? 1 : 5
});
if (rdata.status) {
GetSrcList();
layer.close(openId);
}
});
return;
}
openId = layer.open({
type: 1,
skin: 'demo-class',
area: '480px',
title: '添加源码包',
closeBtn: 2,
shift: 5,
shadeClose: false,
content: 'Title<input type="text" name="title"><br>\
Identification<input type="text" name="name"><br>\
Description<input type="text" name="ps"><br>\
Version<input type="text" name="version"><br>\
Whether to use URL rewrite<input type="checkbox" name="rewrite"><br>\
Whether to execute the installation script<input type="checkbox" name="shell"><br>\
Supported PHP version<input type="text" name="php"><br>\
md5<input type="text" name="md5">\
Download link<input type="text" name="download"><br>\
<button class="btn btn-default btn-sm" onclick="AddDeployment(1);">Submit</button>'
});
}
$(".searchInput").keyup(function(e) {
if (e.keyCode == 13) {
GetSrcList();
}
});
function AddSite(codename, title) {
var array;
var str = "";
var domainlist = '';
var domain = array = $("#mainDomain").val().split("\n");
var Webport = [];
var checkDomain = domain[0].split('.');
if (checkDomain.length < 1) {
layer.msg('The domain name is not in the correct format. Please re-enter!', {
icon: 2
});
return;
}
for (var i = 1; i < domain.length; i++) {
domainlist += '"' + domain[i] + '",';
}
Webport = domain[0].split(":")[1]; //主域名端口
if (Webport == undefined) {
Webport = "80";
}
domainlist = domainlist.substring(0, domainlist.length - 1); //子域名json
mainDomain = domain[0].split(':')[0];
domain = '{"domain":"' + domain[0] + '","domainlist":[' + domainlist + '],"count":' + domain.length + '}'; //拼接json
var php_version = $("select[name='version']").val();
var loadT = layer.msg('Creating site <img src="/static/img/ing.gif">', {
icon: 16,
time: 0,
shade: [0.3, "#000"]
})
var data = $("#addweb").serialize() + "&port=" + Webport + "&webname=" + domain + '&ftp=false&sql=true&address=localhost&codeing=utf8&version=' + php_version;
$.post('/site?action=AddSite', data, function(ret) {
layer.close(loadT)
if (!ret.siteStatus) {
layer.msg(ret.msg, {
icon: 5
});
return;
}
layer.close(add)
var sqlData = '';
if (ret.databaseStatus) {
sqlData = "<p class='p1'>Database account information</p>\
<p><span>Database name</span><strong>" + ret.databaseUser + "</strong></p>\
<p><span>User</span><strong>" + ret.databaseUser + "</strong></p>\
<p><span>Password</span><strong>" + ret.databasePass + "</strong></p>\
"
}
var pdata = 'dname=' + codename + '&site_name=' + mainDomain + '&php_version=' + php_version;
var loadT = layer.msg('<div class="depSpeed">Submitting <img src="/static/img/ing.gif"></div>', {
icon: 16,
time: 0,
shade: [0.3, "#000"]
});
setTimeout(function() {
GetSpeed();
}, 2000);
$.post('/deployment?action=SetupPackage', pdata, function(rdata) {
layer.close(loadT)
if (!rdata.status) {
layer.msg(rdata.msg, {
icon: 5,
time: 10000
});
return;
}
if (rdata.msg.admin_username != '') {
sqlData = "<p class='p1'>Successfully deployed, no need to install, please login to modify the default account password.</p>\
<p><span>User</span><strong>" + rdata.msg.admin_username + "</strong></p>\
<p><span>Password</span><strong>" + rdata.msg.admin_password + "</strong></p>\
"
}
sqlData += "<p><span>Visit site</span><a class='btlink' href='http://" + mainDomain + rdata.msg.success_url + "' target='_blank'>http://" + mainDomain + rdata.msg.success_url + "</a></p>";
layer.open({
type: 1,
area: '600px',
title: 'Successfully deployed [' + title + ']',
closeBtn: 2,
shadeClose: false,
content: "<div class='success-msg'>\
<div class='pic'><img src='/static/img/success-pic.png'></div>\
<div class='suc-con'>\
" + sqlData + "\
</div>\
</div>",
});
if ($(".success-msg").height() < 150) {
$(".success-msg").find("img").css({
"width": "150px",
"margin-top": "30px"
});
}
});
});
}
function GetSpeed() {
if (!$('.depSpeed')) return;
$.get('/deployment?action=GetSpeed', function(speed) {
if (speed.status === false) return;
if (speed.name == 'Download file') {
speed = '<p>正在' + speed.name + ' <img src="/static/img/ing.gif"></p>\
<div class="bt-progress"><div class="bt-progress-bar" style="width:' + speed.pre + '%"><span class="bt-progress-text">' + speed.pre + '%</span></div></div>\
<p class="f12 c9"><span class="pull-left">' + ToSize(speed.used) + '/' + ToSize(speed.total) + '</span><span class="pull-right">' + ToSize(speed.speed) + '/s</span></p>';
$('.depSpeed').prev().hide();
$('.depSpeed').css({
"margin-left": "-37px",
"width": "380px"
});
$('.depSpeed').parents(".layui-layer").css({
"margin-left": "-100px"
});
} else {
speed = '<p>' + speed.name + '</p>';
$('.depSpeed').prev().show();
$('.depSpeed').removeAttr("style");
$('.depSpeed').parents(".layui-layer").css({
"margin-left": "0"
});
}
$('.depSpeed').html(speed);
setTimeout(function() {
GetSpeed();
}, 1000);
});
}
function onekeyCodeSite(codename, versions, title, enable_functions) {
$.post('/site?action=GetPHPVersion', function(rdata) {
var php_version = "";
var n = 0;
for (var i = rdata.length - 1; i >= 0; i--) {
if (versions.indexOf(rdata[i].version) != -1) {
php_version += "<option value='" + rdata[i].version + "'>" + rdata[i].name + "</option>";
n++;
}
}
if (n == 0) {
layer.msg('Missing supported PHP version, please install!', {
icon: 5
});
return;
}
var default_path = bt.get_cookie('sites_path');
if (!default_path) default_path = '/www/wwwroot';
var con = '<form class="bt-form pd20 pb70" id="addweb">\
<div class="line"><span class="tname">Domain</span>\
<div class="info-r c4"><textarea id="mainDomain" class="bt-input-text" name="webname_1" style="width:398px;height:100px;line-height:22px"></textarea>\
<div class="placeholder c9" style="top:10px;left:10px">Fill in a domain name per line, the default is 80 ports<br>Pan-analysis add method *.domain.com<br>If the additional port format is www.domain.com:88</div>\
</div>\
</div>\
<div class="line"><span class="tname">Note</span>\
<div class="info-r c4"><input id="Wbeizhu" class="bt-input-text" name="ps" placeholder="Website note" style="width:398px" type="text"> </div>\
</div>\
<div class="line"><span class="tname">Document Root</span>\
<div class="info-r c4"><input id="inputPath" class="bt-input-text mr5" name="path" value="' + default_path + '" placeholder="Website document root" style="width:398px" type="text"><span class="glyphicon glyphicon-folder-open cursor" onclick="ChangePath(\'inputPath\')"></span> </div>\
</div>\
<div class="line"><span class="tname">Database</span>\
<div class="info-r c4">\
<input id="datauser" class="bt-input-text" name="datauser" placeholder="Username/DB name" style="width:190px;margin-right:13px" type="text">\
<input id="datapassword" class="bt-input-text" name="datapassword" placeholder="Password" style="width:190px" type="text">\
</div>\
</div>\
<div class="line"><span class="tname">Source code</span>\
<input class="bt-input-text mr5 disable" name="code" style="width:190px" value="' + title + '" disabled>\
<span class="c9">Prepare the source code for your deployment</span>\
</div>\
<div class="line"><span class="tname">PHP Version</span>\
<select class="bt-input-text mr5" name="version" id="c_k3" style="width:100px">\
' + php_version + '\
</select>\
<span class="c9">Please select the php version supported by the source program.</span>\
</div>\
<div class="bt-form-submit-btn">\
<button type="button" class="btn btn-danger btn-sm onekeycodeclose">Cancel</button>\
<button type="button" class="btn btn-success btn-sm" onclick="AddSite(\'' + codename + '\',\'' + title + '\')">Submit</button>\
</div>\
</from>';
add = layer.open({
type: 1,
title: "YakPanel One-Click [" + title + ']',
area: '560px',
closeBtn: 2,
shadeClose: false,
content: con
});
if (enable_functions.length > 2) {
layer.msg("<span style='color:red'>Note: The following functions will be released when deploying this project.:<br> " + enable_functions + "</span>", {
icon: 7,
time: 10000
});
}
var placeholder = "<div class='placeholder c9' style='top:10px;left:10px'>Fill in a domain name per line, the default is 80 ports<br>Pan-analysis add method *.domain.com<br>If the additional port format is www.domain.com:88</div>";
$(".onekeycodeclose").click(function() {
layer.close(add);
});
$('#mainDomain').after(placeholder);
$(".placeholder").click(function() {
$(this).hide();
$('#mainDomain').focus();
})
$('#mainDomain').focus(function() {
$(".placeholder").hide();
});
$('#mainDomain').blur(function() {
if ($(this).val().length == 0) {
$(".placeholder").show();
}
});
//FTP账号数据绑定域名
$('#mainDomain').on('input', function() {
var defaultPath = bt.get_cookie('sites_path');
if (!defaultPath) defaultPath = '/www/wwwroot';
var array;
var res, ress;
var str = $(this).val();
var len = str.replace(/[^\x00-\xff]/g, "**").length;
array = str.split("\n");
ress = array[0].split(":")[0];
res = ress.replace(new RegExp(/([-.])/g), '_');
if (res.length > 15) res = res.substr(0, 15);
if ($("#inputPath").val().substr(0, defaultPath.length) == defaultPath) $("#inputPath").val(defaultPath + '/' + ress);
if (!isNaN(res.substr(0, 1))) res = "sql" + res;
if (res.length > 15) res = res.substr(0, 15);
$("#Wbeizhu").val(ress);
$("#datauser").val(res);
})
$('#Wbeizhu').on('input', function() {
var str = $(this).val();
var len = str.replace(/[^\x00-\xff]/g, "**").length;
if (len > 20) {
str = str.substring(0, 20);
$(this).val(str);
layer.msg('Do not exceed 20 characters', {
icon: 0
});
}
})
//获取当前时间时间戳截取后6位
var timestamp = new Date().getTime().toString();
var dtpw = timestamp.substring(7);
$("#datauser").val("sql" + dtpw);
$("#datapassword").val(_getRandomString(10));
});
}
//生成n位随机密码
function _getRandomString(len) {
len = len || 32;
var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; // 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
var maxPos = $chars.length;
var pwd = '';
for (i = 0; i < len; i++) {
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
}
var score = {
total: 1,
type: '',
data: [],
// 获取评论信息
get_score_info: function(obj, callback) {
var loadT = layer.msg('<div class="depSpeed">Getting comment information <img src="/static/img/ing.gif"></div>', {
icon: 16,
time: 0,
shade: [0.3, "#000"]
});
bt.send('get_score', 'plugin/get_score', {
pid: obj.pid,
p: obj.p,
limit_num: obj.limit_num
}, function(res) {
layer.close(loadT);
if (res.status === false) {
layer.msg(res.msg, {
icon: 2
});
return false;
}
if (callback) callback(res);
});
},
render_score_info: function(obj, callback) {
var config = {
pid: obj.pid
},
_this = this;
obj.p == undefined ? config.p = 1 : config.p = parseInt(obj.p)
obj.limit_num == undefined ? config.limit_num = '' : config.limit_num = obj.limit_num
score.get_score_info(config, function(res) {
var _split_score = res.split.reverse(),
_average_score = (_split_score[4] * 1 + _split_score[3] * 2 + _split_score[2] * 3 + _split_score[1] * 4 + _split_score[0] * 5) / res.total,
_data = res.data,
_html = '';
_this.total = res.total;
$('.comment_user_count').text(obj.count);
$('.comment_num').text((res.total !== 0 ? _average_score : 0).toFixed(1));
$('.comment_partake').text(res.total);
$('.comment_rate').text(res.total !== 0 ? ((((_split_score[0] + _split_score[1]) / res.total).toFixed(2) * 100) + '%') : '0%');
for (var i = 0; i < 5; i++) {
$('.comment_star_group:eq(' + i + ')').find('.comment_progress .comment_progress_bgw').css('width', ((_split_score[i] / res.total).toFixed(2) * 100) + '%')
}
$('.comment_tab span:eq(1)').find('i').text(_split_score[0] + _split_score[1]);
$('.comment_tab span:eq(2)').find('i').text(_split_score[2] + _split_score[3]);
$('.comment_tab span:eq(3)').find('i').text(_split_score[4]);
for (var j = 0; j < _data.length; j++) {
_html += '<div class="comment_box" data-index="' + ((config.p == 1 ? '' : config.p - 1) + (j + '')) + '">\
<div class="comment_box_title">\
<span class="nice_star">\
<span class="glyphicon ' + (_data[j].num >= 1 ? 'star_active' : '') + ' glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon ' + (_data[j].num >= 2 ? 'star_active' : '') + ' glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon ' + (_data[j].num >= 3 ? 'star_active' : '') + ' glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon ' + (_data[j].num >= 4 ? 'star_active' : '') + ' glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon ' + (_data[j].num >= 5 ? 'star_active' : '') + ' glyphicon-star" aria-hidden="true"></span>\
</span>\
<span class="nice_name" title="' + _data[j].nickname + '">' + _data[j].nickname + '</span>\
<span class="nice_time" title="' + bt.format_data(_data[j].addtime) + '">' + timeago(_data[j].addtime * 1000) + '</span>\
</div>\
<div class="comment_box_content">' + (getLength(_data[j].ps) > 65 ? reBytesStr(_data[j].ps, 65) + '...&nbsp;<a href="javascript:;" class="btlink">Details</a>' : _data[j].ps) + '</div>\
</div>'
// console.log(getLength(_data[j].ps)>70?reBytesStr(_data[j].ps,70)+'&nbsp;<a href="javascript:;" class="btlink">详情</a>':_data[j].ps);
}
_this.data = _this.data.concat(_data);
if (res.total > 10 && _data.length === 10) {
_html += '<div class="comment_box get_next_page"><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span>Click for more comments</div>'
}
$('.comment_content').find('.get_next_page').remove();
$('.comment_content').append(_html);
if ($('.comment_content .comment_box').length > 6) {
$('.comment_content').addClass('box-shadow');
} else {
$('.comment_content').removeClass('box-shadow');
}
if (callback) callback(res);
});
},
// 设置评论信息
set_score_info: function(obj, callback) {
var loadT = layer.msg('<div class="depSpeed">Submitting comment <img src="/static/img/ing.gif"></div>', {
icon: 16,
time: 0,
shade: [0.3, "#000"]
});
bt.send('set_score', 'plugin/set_score', {
pid: obj.pid,
num: obj.num,
ps: obj.ps
}, function(res) {
layer.close(loadT);
if (res.status === false) {
layer.msg(res.msg, {
icon: 2
});
return false;
}
if (callback) callback(res);
});
},
open_score_view: function(_pid, _name, _count) {
layer.open({
type: 1,
title: '[ ' + _name + '] Score',
area: ['550px', '350px'],
closeBtn: 2,
shadeClose: false,
content: '<div class="pd20 score_info_view"><div class="comment_title">\
<div class="comment_left">\
<div class="comment_num">--</div>\
<ul class="comment_num_tips">\
<li>user count&nbsp;<span class="comment_user_count">--</span></li>\
<li>&nbsp;<span class="comment_partake">--</span>&nbsp;people participated in the score</li>\
<li><span class="comment_rate">--</span>&nbsp;Favorable rate</li>\
</ul>\
</div>\
<div class="comment_right">\
<div class="comment_star_group">\
<div class="comment_star">\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
</div>\
<div class="comment_progress">\
<div class="comment_progress_bgw"></div>\
<div class="comment_progress_speed"></div>\
</div>\
</div>\
<div class="comment_star_group">\
<div class="comment_star">\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
</div>\
<div class="comment_progress">\
<div class="comment_progress_bgw"></div>\
<div class="comment_progress_speed"></div>\
</div>\
</div>\
<div class="comment_star_group">\
<div class="comment_star">\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
</div>\
<div class="comment_progress">\
<div class="comment_progress_bgw"></div>\
<div class="comment_progress_speed"></div>\
</div>\
</div>\
<div class="comment_star_group">\
<div class="comment_star">\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
</div>\
<div class="comment_progress">\
<div class="comment_progress_bgw"></div>\
<div class="comment_progress_speed"></div>\
</div>\
</div>\
<div class="comment_star_group">\
<div class="comment_star">\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_none glyphicon-star" aria-hidden="true"></span>\
<span class="glyphicon star_active glyphicon-star" aria-hidden="true"></span>\
</div>\
<div class="comment_progress">\
<div class="comment_progress_bgw"></div>\
<div class="comment_progress_speed"></div>\
</div>\
</div>\
</div>\
</div>\
<div class="comment_tab">\
<span class="active" data-num="">All evaluation</span>\
<span data-num="5">Praise&nbsp;<i>--</i>&nbsp;</span>\
<span data-num="3">Average&nbsp;<i>--</i>&nbsp;</span>\
<span data-num="1">Bad review&nbsp;<i>--</i>&nbsp;</span>\
</div>\
<div class="comment_content">\
</div>\
<div class="add_score_view">\
<div class="score_icon_group" data-icon="5">\
<span class="glyphicon glyphicon-star active" aria-hidden="true" title="very bad1 star"></span>\
<span class="glyphicon glyphicon-star active" aria-hidden="true" title="bad2 star"></span>\
<span class="glyphicon glyphicon-star active" aria-hidden="true" title="general3 star"></span>\
<span class="glyphicon glyphicon-star active" aria-hidden="true" title="good4 star"></span>\
<span class="glyphicon glyphicon-star active" aria-hidden="true" title="very good5 star" ></span>\
</div>\
<div class="score_icon_group_tips">Recommended: 5 points</div>\
<textarea class="score_input bt-input-text" placeholder="Please enter the evaluation content, the number of words is less than 60 words, can be empty." name="score_val"></textarea>\
<span class="score_input_tips pull-right">Can also enter&nbsp;<i>60</i>&nbsp;words</span>\
</div>\
<div class="edit_view ">\
<span>Participate in the score</span>\
</div>\
</div>',
success: function(index, layero) {
score.data = [];
score.render_score_info({
pid: _pid,
count: _count
}, function() {
$('.score_info_view').show();
});
score.score_icon_time = null;
$('.score_icon_group span').hover(function() {
var _active = $(this).hasClass('active');
// if($(this).prevAll().length == 0 && $(this).nextAll('.active').length == 0 && _active){
// $(this).removeClass('active').nextAll().removeClass('active')
// $('.score_icon_group_tips').html('选择以上图标选择评分等级1-5');
// $('.score_icon_group').attr('data-icon',0)
// }else{
// $(this).addClass('active').nextAll().removeClass('active');
// $(this).prevAll().addClass('active');
// $('.score_icon_group').attr('data-icon',$(this).prevAll().length +1)
// var _title = $(this).attr('title');
// $('.score_icon_group_tips').text(_title);
// }
});
$('.score_icon_group span').click(function() {
var _active = $(this).hasClass('active');
if ($(this).prevAll().length == 0 && $(this).nextAll('.active').length == 0 && _active) {
$('.edit_view').addClass('active');
$(this).removeClass('active').nextAll().removeClass('active')
$('.score_icon_group_tips').html('Click on the selection icon to rate 1-5 stars');
$('.score_icon_group').attr('data-icon', 0)
} else {
$('.edit_view').removeClass('active');
$(this).addClass('active').nextAll().removeClass('active');
$(this).prevAll().addClass('active');
$('.score_icon_group').attr('data-icon', $(this).prevAll().length + 1)
var _title = $(this).attr('title');
$('.score_icon_group_tips').text(_title);
}
});
$('.comment_tab span').click(function(e) {
var _num = $(this).attr('data-num');
$('.comment_content').removeClass('box-shadow');
$(this).addClass('active').siblings().removeClass('active');
$('.comment_content').html('');
score.data = []
score.type = _num;
score.render_score_info({
pid: _pid,
limit_num: _num,
count: _count
});
});
$('.comment_content').on('click', '.get_next_page', function() {
var _next_page = ($('.comment_content .comment_box').length / 10) + 1;
score.render_score_info({
pid: _pid,
limit_num: score.type,
p: _next_page,
count: _count
});
});
$('.comment_content').on('click', '.comment_box', function() {
if (!$(this).hasClass('get_next_page')) {
var _index = $(this).attr('data-index');
layer.open({
type: 1,
title: false,
area: ['350px', '200px'],
closeBtn: 2,
shadeClose: false,
content: '<div class="score_details" >' + $(this).html() + '</div>',
success: function(index, layers) {
$('.score_details .comment_box_content').html(score.data[_index]['ps']);
}
});
}
});
$('.edit_view').click(function() {
if ($('.edit_view').hasClass('active')) {
// layer.msg('请选择评分等级',{icon:2});
$('.score_icon_group_tips').css('color', 'red');
setTimeout(function() {
$('.score_icon_group_tips').removeAttr('style')
}, 1000);
return false
}
var _num = parseInt($('.score_icon_group').attr('data-icon')),
_ps = $('.score_input').val();
if (_num == 0) {
layer.msg('Rating level cannot be empty', {
icon: 2
});
return false;
}
if (120 - getLength(_ps) < 0) {
layer.msg('Evaluation information cannot exceed 60 words', {
icon: 2
});
return false;
}
score.set_score_info({
pid: _pid,
num: _num,
ps: _ps == '' ? 'User did not make any evaluation' : _ps
}, function(res) {
layer.msg(res.msg, {
icon: 1
});
score.render_score_info({
pid: _pid,
limit_num: score.type,
count: _count
});
soft.flush_cache();
layer.close(index);
});
return false
layer.open({
type: 1,
title: 'Add review',
area: ['400px', '350px'],
closeBtn: 2,
shadeClose: false,
btn: ['Confirm', 'Cancel'],
content: '<div class="add_score_view">\
<div class="score_icon_group" data-icon="0">\
<span class="glyphicon glyphicon-star" aria-hidden="true" title="very bad1 star"></span>\
<span class="glyphicon glyphicon-star" aria-hidden="true" title="bad2 star"></span>\
<span class="glyphicon glyphicon-star" aria-hidden="true" title="general3 star"></span>\
<span class="glyphicon glyphicon-star" aria-hidden="true" title="good4 star"></span>\
<span class="glyphicon glyphicon-star" aria-hidden="true" title="very good5 star" ></span>\
</div>\
<div class="score_icon_group_tips">(Click on the icon above to select rating 1-5)</div>\
<textarea class="score_input bt-input-text" placeholder="Please enter the evaluation content, the number of words is less than 60 words, can be empty." name="score_val"></textarea>\
<span class="score_input_tips pull-right">Can also enter&nbsp;<i>60</i>&nbsp;words</span>\
</div>',
success: function() {
$('.score_icon_group span').click(function() {
var _active = $(this).hasClass('active');
if ($(this).prevAll().length == 0 && $(this).nextAll('.active').length == 0 && _active) {
$(this).removeClass('active').nextAll().removeClass('active')
$('.score_icon_group_tips').html('(Click on the icon above to select rating 1-5)');
$('.score_icon_group').attr('data-icon', 0)
} else {
$(this).addClass('active').nextAll().removeClass('active');
$(this).prevAll().addClass('active');
$('.score_icon_group').attr('data-icon', $(this).prevAll().length + 1)
var _title = $(this).attr('title');
$('.score_icon_group_tips').text(_title);
}
});
$('.score_input').on('keydown keyup focus click', function() {
var _val = $('.score_input').val(),
_size = 120 - getLength(_val);
if (_size > 0) {
$('.score_input_tips i').css('color', _size > 20 ? '#666' : 'red').text(parseInt(_size / 2));
$('.score_input').attr('style', '');
} else {
$('.score_input_tips i').text(0)
$('.score_input').css({
'outline-color': 'red',
'border': '1px solid red'
});
}
});
},
yes: function(index, layero) {
var _num = parseInt($('.score_icon_group').attr('data-icon')),
_ps = $('.score_input').val();
if (_num == 0) {
layer.msg('Rating level cannot be empty', {
icon: 2
});
return false;
}
if (120 - getLength(_ps) < 0) {
layer.msg('Evaluation information cannot exceed 60 words', {
icon: 2
});
return false;
}
score.set_score_info({
pid: _pid,
num: _num,
ps: _ps == '' ? 'User did not make any evaluation' : _ps
}, function(res) {
layer.msg(res.msg, {
icon: 1
});
score.render_score_info({
pid: _pid,
limit_num: score.type,
count: _count
});
soft.flush_cache();
layer.close(index);
});
}
});
});
}
})
}
}
function timeago(dateTimeStamp) { //dateTimeStamp是一个时间毫秒注意时间戳是秒的形式在这个毫秒的基础上除以1000就是十位数的时间戳。13位数的都是时间毫秒。
if (dateTimeStamp.toString().length < 10) dateTimeStamp = dateTimeStamp * 1000
var minute = 1000 * 60,
hour = minute * 60,
day = hour * 24,
week = day * 7,
halfamonth = day * 15,
month = day * 30,
now = new Date().getTime(), //获取当前时间毫秒
diffValue = now - dateTimeStamp; //时间差
if (diffValue <= 0) {
return 'Just a moment ago';
}
var minC = diffValue / minute, //计算时间差的分,时,天,周,月
hourC = diffValue / hour,
dayC = diffValue / day,
weekC = diffValue / week,
monthC = diffValue / month,
result = 'Just a moment ago';
if (monthC >= 1 && monthC <= 3) {
result = " " + parseInt(monthC) + "month ago"
} else if (weekC >= 1 && weekC <= 3) {
result = " " + parseInt(weekC) + "week ago"
} else if (dayC >= 1 && dayC <= 6) {
result = " " + parseInt(dayC) + "day ago"
} else if (hourC >= 1 && hourC <= 23) {
result = " " + parseInt(hourC) + "hour ago"
} else if (minC >= 1 && minC <= 59) {
result = " " + parseInt(minC) + "minute ago"
} else if (diffValue >= 0 && diffValue <= minute) {
result = "Just a moment ago"
} else {
var datetime = new Date();
datetime.setTime(dateTimeStamp);
var Nyear = datetime.getFullYear(),
Nmonth = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1,
Ndate = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate(),
Nhour = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours(),
Nminute = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes(),
Nsecond = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds(),
result = Nmonth + "-" + Ndate
}
if (!result) result = 'Just a moment ago'
return ((result == undefined || result == 'undefined') ? 'Just a moment ago' : result);
}
// 规则转码
function escapeHTML(val) {
val = "" + val;
return val.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, '&quot;').replace(/'/g, "").replace(/\(/g, "&#40;").replace(/\&#60;/g, "&lt;").replace(/\&#62;/g, "&gt;").replace(/`/g, "&#96;").replace(/=/g, "");
}
function getLength(val) {
var str = new String(val);
var bytesCount = 0;
for (var i = 0, n = str.length; i < n; i++) {
var c = str.charCodeAt(i);
if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
bytesCount += 1;
} else {
bytesCount += 2;
}
}
return bytesCount;
}
function reBytesStr(str, len) {
if ((!str && typeof(str) != 'undefined')) {
return '';
}
var num = 0;
var str1 = str;
var str = '';
for (var i = 0, lens = str1.length; i < lens; i++) {
num += ((str1.charCodeAt(i) > 255) ? 2 : 1);
if (num > len) {
break;
} else {
str = str1.substring(0, i + 1);
}
}
return str;
}