var soft = { is_install: false, 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; 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) return; } soft.is_install = false; bt.soft.get_soft_list(page, type, search, function (rdata) { if (rdata.pro >= 0) { $("#updata_pro_info").html(''); } else if (rdata.pro === -2) { $("#updata_pro_info").html('
专业版已到期,付费插件暂停使用。'); } else if (rdata.pro === -1) { $("#updata_pro_info").html('
升级专业版,所有插件,免费使用。\
'); } if (type == 10) { $("#updata_pro_info").html('
安全提醒:第三方插件上架前,宝塔官方进行了安全审计,但可能还存在安全风险,在生产环境使用前请自行甄别 免费入驻获取第三方应用
') } else if (type == 11) { $("#updata_pro_info").html('
即将上线,敬请期待
') } var tBody = ''; rdata.type.unshift({ icon: 'icon', id: 0, ps: '全部', sort: 1, title: '全部' },{ icon: 'icon', id: -1, ps: '已安装', sort: 1, title: '已安装' }) for (var i = 0; i < rdata.type.length; i++) { var c = ''; if (istype == rdata.type[i].id) { c = 'class="on"'; } tBody += '' + rdata.type[i].title + ''; } 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); } else { soft.get_dep_list(0); } }) var data = rdata.list.data; $('#softPage').html(rdata.list.page); var phps = ['php-5.2', 'php-5.3', 'php-5.4']; var _tab = bt.render({ table: '#softList', columns: [ { field: 'title', title: '软件名称', 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 + '\')" '; } } if (rdata.apache22 && item.name.indexOf('php-') >= 0 && $.inArray(item.name, phps) == -1) click_opt = ' title="Apache2.2不兼容此版本,如需使用请切换到Apache2.4或Nginx"'; return '' + item.title + ' ' + version + ''; } }, { field: 'price', title: '开发商', width: 92, templet: function (item) { if(!item.author) return '官方' return item.author; } }, { field: 'ps', title: '说明', 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 += " (" + lan.soft.apache22 + ")"; } } else if (!rdata.apache22) { if (!item.fpm) { ps += " (" + lan.soft.apache24 + ")"; } } } return '' + ps + ''; } }, { field: 'price', title: '价格', width: 72, templet: function (item) { var price = '免费'; if (item.price > 0) { price = '¥' + item.price + ''; } return price; } }, (type ==10?{ field: 'sort', width: 60, title: '评分', templet: function (item) { return item.sort !== undefined?('' + (item.sort <= 0 || item.sort >5?'无评分':item.sort.toFixed(1)) +''):'--'; } }:''), { field: 'endtime', width: 120, title: '到期时间', 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 = '永久'; } else if (item.endtime === -1) { endtime = '未开通'; } else if (item.endtime === -2) { if (item.type != 10) { endtime = '已到期' + ' (续费)'; }else { endtime = '已到期' + ' (续费)'; } } } return endtime; } }, { field: 'path', width: 40, title: '位置', templet: function (item) { var path = ''; if (item.setup) { path = ''; } return path; } }, (type !=10?{ field: 'status', width: 40, title: '状态', templet: function (item) { var status = ''; if (item.setup) { if (item.status) { status = ''; } else { status = ''; } } return status; } }:''), { field: 'index', width: 64, title: '首页显示', 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 = '
'; } return to_index; } }, { field: 'opt', width: 120, title: '操作', align: 'right', templet: function (item) { var option = ''; var pay_opt = ''; if (item.endtime < 0 && item.pid > 0) { var re_msg = ''; var re_status = 0; switch (item.endtime) { case -1: re_msg = '立即购买'; break; case -2: re_msg = '立即续费'; re_status = 1; break; } if (item.type != 10) { pay_opt = '' + re_msg + ''; } else { pay_opt = '' + re_msg + ''; } } var is_php = item.name.indexOf('php-') >= 0; if (rdata.apache22 && is_php && $.inArray(item.name, phps) == -1) { if (item.setup) { option = '' + lan.soft.uninstall + ''; } else { option = '不兼容'; } } else if (rdata.apache24 && item.name == 'php-5.2') { if (item.setup) { option = '' + lan.soft.uninstall + ''; } else { option = '不兼容'; } } 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 += '更新 | '; break; } } } else { var min_version = item.versions[0]; var cloud_version = min_version.m_version + '.' + min_version.version; if (item.version != cloud_version) option += '更新 | '; } if (item.admin) { option += '' + lan.soft.setup + ' | '; } else { option += '' + lan.soft.setup + ' | '; } } else { option = pay_opt + ' | ' + option; } option += '' + lan.soft.uninstall + ''; } else if (item.task == '-1') { option = '正在安装'; soft.is_install = true; } else if (item.task == '0') { option = '等待安装'; soft.is_install = true; } else if (item.task == '-2') { option = '正在更新'; soft.is_install = true; } else { if (pay_opt) { option = pay_opt; } else { option = '' + lan.soft.install + ''; } } } return option; } } ], 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) { setTimeout(function () { soft.get_list(bt.get_cookie('load_page') + 'not_load', bt.get_cookie('load_type'), bt.get_cookie('load_search')); }, 3000); } }) }, get_dep_list: function (p) { var loadT = layer.msg('正在获取列表 ', { 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 = ''; rdata.type.unshift({ icon: 'icon', id: 0, ps: '全部', sort: 1, title: '全部' },{ icon: 'icon', id: -1, ps: '已安装', sort: 1, title: '已安装' }); for (var i = 0; i < rdata.type.length; i++) { var c = ''; if ('11' == rdata.type[i].id) { c = 'class="on"'; } tBody += '' + rdata.type[i].title + ''; } $(".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 = '
\ 宝塔一键部署已上线,诚邀全球优秀项目入驻(限项目官方) \ 免费入驻\ 导入项目\
'; rdata.dep_type.unshift({ tid: 0, title: '全部' }) rdata.dep_type.push({ tid: 100, title: '其它' }) for (var i = 0; i < rdata.dep_type.length; i++) { var c = ''; if (istype == rdata.dep_type[i].tid) { c = 'class="on"'; } tbody += '' + rdata.dep_type[i].title + ''; } tbody += "
"; $("#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 = '\ \ 名称\ 版本\ 简介\ 支持PHP版本\ 提供者\ 评价\ 操作\ \ '; 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 = ' | 更新 | 删除'; rdata.list[i].min_image = icon_other } else { rdata.list[i].min_image += '?t=' + new Date().format("yyyyMMdd"); } zbody += '' + '' + rdata.list[i].title + '' + '' + rdata.list[i].version + '' + '' + rdata.list[i].ps + '' + '' + rdata.list[i].php + '' + '' + (rdata.list[i].author == '宝塔' ? rdata.list[i].title : rdata.list[i].author) + '' + '' + (rdata.list[i].sort !== undefined?('' + (rdata.list[i].sort <= 0 || rdata.list[i].sort > 5?'无评分':rdata.list[i].sort.toFixed(1))+''):'--') + '' + '一键部署' + remove_opt+'' + '' } $("#softList").html(zbody); $("#softPage").html(''); $(".searchInput").val(''); }); }, remove_other_dep: function (name) { bt.show_confirm('删除自定义项目', '您真的要删除[' + name + ']吗?', function () { var loadT = layer.msg('正在删除,请稍候...', { 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 = '
\
英文名\
\ 格式: [0-9A-Za-z_-]+,不要带有空格和特殊字符\
\
\
中文名\
\ 用于显示到列表的名称\
\
\
PHP版本\ \ 多个请使用","(逗号)隔开,不要使用PHP5.2\
\
解禁的函数\ \ 多个请使用","(逗号)隔开,只解禁必要函数\
\
项目版本\ \ 当前导入的项目版本\
\
简介\
\
\
上传项目包\ \ 请上传zip格式的项目包,里面必需包含auto_insatll.json配置文件\
\
\ \ \
\ '; layer.open({ type: 1, title: "导入一键部署项目包", 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 = '\
英文名\ \ 格式: [0-9A-Za-z_-]+,不要带有空格和特殊字符\
\
中文名\ \ 用于显示到列表的名称\
\
PHP版本\ \ 多个请使用","(逗号)隔开,不要使用PHP5.2\
\
解禁的函数\ \ 多个请使用","(逗号)隔开,只解禁必要函数\
\
项目版本\ \ 当前导入的项目版本\
\
简介\
\
\
上传项目包\ \ 请上传zip格式的项目包,里面必需包含auto_insatll.json配置文件\
\
\ \ \
\ '; layer.open({ type: 1, title: "更新一键部署项目包", 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('以下为必填(英文名/中文名/项目版本/PHP版本/简介)', { icon: 2 }); return; } var fs = $("input[name='dep_zip']")[0].files; if (fs.length < 1) { layer.msg('请选择项目包文件', { icon: 2 }); return; } var f = fs[0] if (f.type.indexOf('zip') == -1) { layer.msg('只支持zip格式的文件!'); return; } if (!pdata.get('dep_zip')) pdata.append('dep_zip', f); var loadT = layer.msg('正在导入...', { 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('导入成功!'); },1000) } }, error: function (responseStr) { layer.msg('上传失败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 } ], mysqld: [ { type: 'change_data_path', title: lan.soft.save_path }, { type: 'change_mysql_port', title: lan.site.port }, { 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: '负载状态' }, { type: 'memcached_set', title: '性能调整' }, ], redis: [ { type: 'get_redis_status', title: '负载状态' }, ], tomcat: [ { type: 'log', title: '运行日志' } ], apache: [ { type: 'apache_set', title: '性能调整' }, { type: 'apache_status', title: lan.soft.nginx_status }, { type: 'log', title: '运行日志' } ], nginx: [ { type: 'nginx_set', title: '性能调整' }, { type: 'nginx_status', title: lan.soft.nginx_status }, { type: 'log', title: '错误日志' } ] }; var arrs = datas.public; if (name == 'phpmyadmin') arrs = []; arrs = arrs.concat(datas[name]); if (arrs) { for (var i = 0; i < arrs.length; i++) { var item = arrs[i]; if (item) { meun += '

' + item.title + '

'; } } } } 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: "640px", title: name + lan.soft.admin, closeBtn: 2, shift: 0, content: '
' }); var menu = $('.bt-soft-menu').data("data", rdata); setTimeout(function () { menu.append($('

' + lan.soft.service + '

')) 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: '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]; 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; var apache24 = item.apache24 ? 'class="apache24"' : ''; menu.append($('

' + item.title + '

').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 '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]]; } var btns = $('
'); for (var i = 0; i < status_list.length; i++) btns.append(''); tabCon.append('

' + lan.soft.status + ':' + (data.status ? lan.soft.on : lan.soft.off) + ''; if (name == 'mysqld') tabCon.append(help); break; case 'config': var tabCon = $(".soft-man-con").empty(); tabCon.append('

' + lan.bt.edit_ps + '

'); tabCon.append('') tabCon.append('') tabCon.append(bt.render_help([lan.get('config_edit_ps', [version])])) var fileName = bt.soft.get_config_path(version); 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": "350px", "margin": 0, "padding": 0 }); $("#OnlineEditFileBtn").click(function () { $("#textBody").text(editor.getValue()); bt.soft.save_config(fileName, editor.getValue()) }); }) 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: '当前已经是[' + opt_version + ']', icon: 2 }) return; } if (data.name == 'mysql') { 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 '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 = '
\ \ \ \ \ \ \
'+ lan.soft.mysql_status_title1 + '' + getLocalTime(rdata.Run) + '' + lan.soft.mysql_status_title5 + '' + parseInt(rdata.Questions / rdata.Uptime) + '
'+ lan.soft.mysql_status_title2 + '' + rdata.Connections + '' + lan.soft.mysql_status_title6 + '' + parseInt((parseInt(rdata.Com_commit) + parseInt(rdata.Com_rollback)) / rdata.Uptime) + '
'+ lan.soft.mysql_status_title3 + '' + ToSize(rdata.Bytes_sent) + '' + lan.soft.mysql_status_title7 + '' + rdata.File + '
'+ lan.soft.mysql_status_title4 + '' + ToSize(rdata.Bytes_received) + '' + lan.soft.mysql_status_title8 + '' + rdata.Position + '
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
'+ lan.soft.mysql_status_title9 + '' + rdata.Threads_running + '/' + rdata.Max_used_connections + '' + lan.soft.mysql_status_ps1 + '
'+ lan.soft.mysql_status_title10 + '' + (!isNaN(title10)?title10:'0') + '%' + lan.soft.mysql_status_ps2 + '
'+ lan.soft.mysql_status_title11 + '' + (!isNaN(title11)?title11:'0') + '%' + lan.soft.mysql_status_ps3 + '
'+ lan.soft.mysql_status_title12 + '' + (!isNaN(title12)?title12:'0') + '%' + lan.soft.mysql_status_ps4 + '
'+ lan.soft.mysql_status_title13 + '' + cache_size + '' + lan.soft.mysql_status_ps5 + '
'+ lan.soft.mysql_status_title14 + '' + (!isNaN(title14)?title14:'0') + '%' + lan.soft.mysql_status_ps6 + '
'+ lan.soft.mysql_status_title15 + '' + rdata.Open_tables + '' + lan.soft.mysql_status_ps7 + '
'+ lan.soft.mysql_status_title16 + '' + rdata.Select_full_join + '' + lan.soft.mysql_status_ps8 + '
'+ lan.soft.mysql_status_title17 + '' + rdata.Select_range_check + '' + lan.soft.mysql_status_ps9 + '
'+ lan.soft.mysql_status_title18 + '' + rdata.Sort_merge_passes + '' + lan.soft.mysql_status_ps10 + '
'+ lan.soft.mysql_status_title19 + '' + rdata.Table_locks_waited + '' + lan.soft.mysql_status_ps11 + '
' $(".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, ' + lan.soft.mysql_set_key_buffer_size + '' }, { title: 'query_cache_size', type: 'number', name: 'query_cache_size', width: '70px', value: query_cache_size, ps: 'MB, ' + lan.soft.mysql_set_query_cache_size + '' }, { title: 'tmp_table_size', type: 'number', name: 'tmp_table_size', width: '70px', value: tmp_table_size, ps: 'MB, ' + lan.soft.mysql_set_tmp_table_size + '' }, { title: 'innodb_buffer_pool_size', type: 'number', name: 'innodb_buffer_pool_size', value: innodb_buffer_pool_size, width: '70px', ps: 'MB, ' + lan.soft.mysql_set_innodb_buffer_pool_size + '' }, { title: 'innodb_log_buffer_size', type: 'number', name: 'innodb_log_buffer_size', value: innodb_log_buffer_size, width: '70px', ps: 'MB, ' + lan.soft.mysql_set_innodb_log_buffer_size + '' }, { title: 'sort_buffer_size', type: 'number', name: 'sort_buffer_size', width: '70px', value: (sort_buffer_size * 1024), ps: 'KB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_sort_buffer_size + '' }, { title: 'read_buffer_size', type: 'number', name: 'read_buffer_size', width: '70px', value: (read_buffer_size * 1024), ps: 'KB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_read_buffer_size + '' }, { 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 + ', ' + lan.soft.mysql_set_read_rnd_buffer_size + '' }, { title: 'join_buffer_size', type: 'number', name: 'join_buffer_size', width: '70px', value: (join_buffer_size * 1024), ps: 'KB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_join_buffer_size + '' }, { title: 'thread_stack', type: 'number', name: 'thread_stack', width: '70px', value: (thread_stack * 1024), ps: 'KB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_thread_stack + '' }, { title: 'binlog_cache_size', type: 'number', name: 'binlog_cache_size', value: (binlog_cache_size * 1024), width: '70px', ps: 'KB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_binlog_cache_size + '' }, { 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("
"); 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 = '

\ '+ lan.soft.mysql_log_bin + ' ' + ToSize(rdata.msg) + '\ \

'+ lan.soft.mysql_log_err + '

\ \

' $(".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 = '当前没有慢日志.'; var phpCon = ''; $(".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 = '当前没有日志!'; var ebody = '
'; $(".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("
"); 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 'apache_status': var loadT = bt.load(); bt.send('GetApacheStatus', 'ajax/GetApacheStatus', {}, function (rdata) { loadT.close(); $(".soft-man-con").html("
"); 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:'开启',value:'on'},{title:'关闭',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('
'); 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:'开启',value:'on'},{title:'关闭',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_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('
'); 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: '监听IP,请勿随意修改' }, { title: 'PORT', name: 'port', type: 'number', width: '120px', value: rdata.port, ps: '监听端口,一般无需修改' }, { title: 'CACHESIZE', name: 'cachesize', type: 'number', width: '120px', value: rdata.cachesize, ps: 'MB,缓存大小,建议不要大于512M' }, { title: 'MAXCONN', name: 'maxconn', type: 'number', width: '120px', value: rdata.maxconn, ps: '最大连接数,建议不要大于40960' }, { title: ' ', items: [{ text: lan.public.save, name: 'btn_set_memcached', type: 'button', callback: function (ldata) { if (ldata.ip.split('.').length < 4) { layer.msg('IP地址格式不正确!', { icon: 2 }); return; } if (ldata.port < 1 || ldata.port > 65535) { layer.msg('端口范围不正确!', { icon: 2 }); return; } if (ldata.cachesize < 8) { layer.msg('缓存值过小', { icon: 2 }); return; } if (ldata.maxconn < 4) { layer.msg('最大连接数过小', { 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, '监听IP']; arr['PORT'] = [rdata.port, '监听端口']; arr['CACHESIZE'] = [rdata.cachesize + ' MB', '最大缓存容量']; arr['MAXCONN'] = [rdata.maxconn, '最大连接数限制']; arr['curr_connections'] = [rdata.curr_connections, '当前打开的连接数']; arr['cmd_get'] = [rdata.cmd_get, 'GET请求数']; arr['get_hits'] = [rdata.get_hits, 'GET命中次数']; arr['get_misses'] = [rdata.get_misses, 'GET失败次数']; arr['hit'] = [rdata.hit.toFixed(2) + ' %', 'GET命中率']; arr['curr_items'] = [rdata.curr_items, '当前被缓存的数据行数']; arr['evictions'] = [rdata.evictions, '因内存不足而被清理的缓存行数']; arr['bytes'] = [ToSize(rdata.bytes), '当前已使用内存']; arr['bytes_read'] = [ToSize(rdata.bytes_read), '请求总大小']; arr['bytes_written'] = [ToSize(rdata.bytes_written), '发送总大小']; var con = "
字段当前值说明
"; $(".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 = "
" + lan.soft.php_version + "
'; $(".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 = '
\ '+ lan.soft.pma_port + '\ \ \
\
\ 开启SSL\ \ \ \
\
\ SSL端口\ \ \
\
\ '+ lan.soft.pma_pass + '\ \ \ \
\
\

'+ lan.soft.pma_user + '

\

'+ lan.soft.pma_pass1 + '

\

'+ lan.soft.pma_pass2 + '

\

\
\ '; $(".soft-man-con").html(con); if (sdata.ext.port) { $(".user_pw").show(); } function get_phpmyadmin_ssl(){ var loading = bt.load('正在获取SSL状态,请稍后...'); 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); }) } break; case 'set_php_config': bt.soft.php.get_config(version, function (rdata) { var divObj = document.getElementById('phpextdiv'); var scrollTopNum = 0; if (divObj) scrollTopNum = divObj.scrollTop; $(".soft-man-con").empty().append('
'); 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 '' } }, { field: 'opt', title: lan.public.action, width: 50, templet: function (item) { var opt = '' + lan.soft.install + '' if (item['task'] == '-1' && item.phpversions.indexOf(version) != -1) { opt = '' + lan.soft.the_install + '' } else if (item['task'] == '0' && item.phpversions.indexOf(version) != -1) { opt = '' + lan.soft.sleep_install + '' } else if (item.status) { opt = '' + lan.soft.uninstall + '' } return opt; } }, ] }) var helps = ['Redis扩展仅支持一个PHP版本安装使用,若在其它PHP版本已安装redis扩展,请勿再装', '请按实际需求安装扩展,不要安装不必要的PHP扩展,这会影响PHP执行效率,甚至出现异常', 'opcache/xcache/apc等脚本缓存扩展,请只安装其中1个,否则可能导致您的站点程序异常'] $(".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() === "安装扩展") { soft.get_tab_contents('set_php_config', obj); } }, 3000) }) break; case 'get_phpinfo': var con = ''; var p_status = { true: 'Yes', false:'No'}; $.post('/ajax?action=php_info', { php_version: version }, function (php_info) { con += '' con += '

基本信息

' con += '
'; con += '' con += '' con += '' con += '
P版本' + php_info.phpinfo.php_version + '安装位置' + php_info.phpinfo.php_path + '
php.ini' + php_info.phpinfo.php_ini + '
已加载' + php_info.phpinfo.modules + '
'; Object.keys(php_info).sort().forEach(function (k) { if (k !== 'phpinfo') { con += '

' + php_info.phpinfo.keys[k] + '

' con += ''; var nkey = 0; Object.keys(php_info[k]).forEach(function (key) { if (nkey == 0) con += ''; con += '' nkey++; if (nkey >= 3) { nkey = 0; con += ''; } }); con += '
' + key + '' + p_status[php_info[k][key]] + '
'; } }) $(".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(); bt.open({ type: 1, title: "PHP-" + version + "-PHPINFO", area: ['70%', '90%'], closeBtn: 2, shadeClose: true, content: rdata.replace('a:link {color: #009; text-decoration: none; background-color: #fff;}', '').replace('a:link {color: #000099; text-decoration: none; background-color: #ffffff;}', '') }) }) }) }); 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 = ''; switch (rdata[i].type) { case 0: var selected_1 = (rdata[i].value == 1) ? 'selected' : ''; var selected_0 = (rdata[i].value == 0) ? 'selected' : ''; ibody = '' break; case 1: var selected_1 = (rdata[i].value == 'On') ? 'selected' : ''; var selected_0 = (rdata[i].value == 'Off') ? 'selected' : ''; ibody = '' break; } mlist += '

' + rdata[i].name + '' + ibody + ', ' + rdata[i].ps + '

' } var tabCon = $(".soft-man-con").empty() tabCon.append('
' + mlist + '
') 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); }); 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("
") 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: '秒' }, { 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("
") 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': bt.soft.php.get_config(version, function (rdata) { 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 = $("
") 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("
") 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 '删除'; } } ] }) 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 = { '30': { max_children: 30, start_servers: 5, min_spare_servers: 5, max_spare_servers: 20 }, '50': { max_children: 50, start_servers: 15, min_spare_servers: 15, max_spare_servers: 35 }, '100': { max_children: 100, start_servers: 20, min_spare_servers: 20, max_spare_servers: 70 }, '200': { max_children: 200, start_servers: 25, min_spare_servers: 25, max_spare_servers: 150 }, '300': { max_children: 300, start_servers: 30, min_spare_servers: 30, max_spare_servers: 180 }, '500': { max_children: 500, start_servers: 35, min_spare_servers: 35, max_spare_servers: 250 } } var limits = [], pmList = []; for (var k in datas) limits.push({ title: k + lan.soft.concurrency, value: k }); var _form_datas = [ { title: lan.soft.concurrency_type, name: 'limit', value: rdata.max_children, type: 'select', items: limits, callback: function (iKey) { var item = datas[iKey.val()] for (var sk in item) $('.' + sk).val(item[sk]); } }, { 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' } ], 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('当前服务器内存不足,最大允许[' + 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 = $('
') 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); } 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 = "
"; $(".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('
'+ '
'+ '存储模式'+ '
'+ ''+ '
'+ '
'+ '
'+ 'IP地址'+ '
'+ ''+ '
'+ '
'+ '
'+ '端口'+ '
'+ ''+ '
'+ '
'+ '
'+ '密码'+ '
'+ ''+ '
'+ '
'+ '
'+ ''+ '
'+ '
    '+ '
  • 若你的站点并发比较高,使用Redis,Memcache能有效提升PHP并发能力
  • '+ '
  • 若调整Session模式后,网站访问异常,请切换回原来的模式
  • '+ '
  • 切换Session模式会使在线的用户会话丢失,请在流量小的时候切换
  • '+ '
'+ '
'+ '
清理Session文件
'+ '
'); if(res.save_handler == 'files'){ bt.soft.php.get_session_count(function(res){ $('.clear_conter').html('
总Session文件数量'+ res.total +'
可清理的Session文件数量'+ res.oldfile +'
') $('.clear_session_file').click(function(){ bt.soft.php.clear_session_count({ title:'清理php_session文件', msg:'是否清理php_session文件?' },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('当前只有存储模式为files才需要清理。').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 = ''; $(".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 = ''; $(".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, '已运行天数']; arrs['tcp_port'] = [rdata.tcp_port, '当前监听端口']; arrs['connected_clients'] = [rdata.connected_clients, '连接的客户端数量']; arrs['used_memory_rss'] = [bt.format_size(rdata.used_memory_rss), 'Redis当前占用的系统内存总量']; arrs['used_memory'] = [bt.format_size(rdata.used_memory), 'Redis历史分配内存的峰值']; arrs['mem_fragmentation_ratio'] = [rdata.mem_fragmentation_ratio, '内存碎片比率']; arrs['total_connections_received'] = [rdata.total_connections_received, '运行以来连接过的客户端的总数量']; arrs['total_commands_processed'] = [rdata.total_commands_processed, '运行以来执行过的命令的总数量']; arrs['instantaneous_ops_per_sec'] = [rdata.instantaneous_ops_per_sec, '服务器每秒钟执行的命令数量']; arrs['keyspace_hits'] = [rdata.keyspace_hits, '查找数据库键成功的次数']; arrs['keyspace_misses'] = [rdata.keyspace_misses, '查找数据库键失败的次数']; arrs['hit'] = [hit, '查找数据库键命中率']; arrs['latest_fork_usec'] = [rdata.latest_fork_usec, '最近一次 fork() 操作耗费的微秒数']; var con = "
字段当前值说明
"; $(".soft-man-con").html(con); bt.render_table('tab_get_redis_status', arrs, true); }) 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: "安装第三方插件包", closeBtn: 2, shift: 5, shadeClose: false, content: '\
\ \
    \
  • 此为第三方开发的插件,宝塔无法验证其可靠性!
  • \
  • 安装过程可能需要几分钟时间,请耐心等候!
  • \
  • 如果已存在此插件,将被替换!
  • \
\
\
' }); }, error: function (responseStr) { layer.msg('上传失败2!', { icon: 2 }); } }); }, input_zip: function (plugin_name, tmp_path) { layer.msg('正在安装,这可能需要几分钟时间...', { icon: 16, time: 0, shade: [0.3, '#000'] }); $.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('正在提交 ', { 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: '标题:
\ 标识:
\ 描述:
\ 版本:
\ 是否写伪静态:
\ 是否执行安装脚本:
\ 支持的PHP版本:
\ md5:\ 下载地址:
\ ' }); } $(".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('域名格式不正确,请重新输入!', { 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('正在创建站点 ', { 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 = "

数据库账号资料

\

数据库名:" + ret.databaseUser + "

\

用户:" + ret.databaseUser + "

\

密码:" + ret.databasePass + "

\ " } var pdata = 'dname=' + codename + '&site_name=' + mainDomain + '&php_version=' + php_version; var loadT = layer.msg('
正在提交
', { 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 = "

已成功部署,无需安装,请登录修改默认账号密码

\

用户:" + rdata.msg.admin_username + "

\

密码:" + rdata.msg.admin_password + "

\ " } sqlData += "

访问站点:http://" + mainDomain + rdata.msg.success_url + "

"; layer.open({ type: 1, area: '600px', title: '已成功部署【' + title+'】', closeBtn: 2, shadeClose: false, content: "
\
\
\ " + sqlData + "\
\
", }); 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 == '下载文件') { speed = '

正在' + speed.name + '

\
' + speed.pre + '%
\

'+ ToSize(speed.used) + '/' + ToSize(speed.total) + '' + ToSize(speed.speed) + '/s

'; $('.depSpeed').prev().hide(); $('.depSpeed').css({ "margin-left": "-37px", "width": "380px" }); $('.depSpeed').parents(".layui-layer").css({ "margin-left": "-100px" }); } else { speed = '

' + speed.name + '

'; $('.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 += ""; n++; } } if (n == 0) { layer.msg('缺少被支持的PHP版本,请安装!', { icon: 5 }); return; } var default_path = bt.get_cookie('sites_path'); if (!default_path) default_path = '/www/wwwroot'; var con = '\
域名\
\
每行填写一个域名,默认为80端口
泛解析添加方法 *.domain.com
如另加端口格式为 www.domain.com:88
\
\
\
备注\
\
\
根目录\
\
\
数据库\
\ \ \
\
\
源码\ \ 准备为你部署的源码程序\
\
PHP版本\ \ 请选择源码程序支持的php版本\
\
\ \ \
\ '; add = layer.open({ type: 1, title: "宝塔一键部署【" + title+'】', area: '560px', closeBtn: 2, shadeClose: false, content: con }); if (enable_functions.length > 2) { layer.msg("注意:部署此项目,以下函数将被解禁:
"+ enable_functions +"
", {icon:7,time:10000}); } var placeholder = "
每行填写一个域名,默认为80端口
泛解析添加方法 *.domain.com
如另加端口格式为 www.domain.com:88
"; $(".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('不要超出20个字符', { 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('
正在获取评论信息
', { 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 += '
\
\ \ \ \ \ \ \ \ '+ _data[j].nickname +'\ '+ timeago(_data[j].addtime * 1000) +'\
\
'+ (getLength(_data[j].ps)>65?reBytesStr(_data[j].ps,65)+'... 详情':_data[j].ps) +'
\
' // console.log(getLength(_data[j].ps)>70?reBytesStr(_data[j].ps,70)+' 详情':_data[j].ps); } _this.data = _this.data.concat(_data); if(res.total > 10 && _data.length === 10){ _html += '
点击获取更多评论
' } $('.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('
正在提交评论信息
', { 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 + '】评分', area:['550px','350px'], closeBtn: 2, shadeClose: false, content:'
\
\
--
\
    \
  • 使用人数 --
  • \
  • 共 -- 人参与评分
  • \
  • -- 好评率
  • \
\
\
\
\
\ \ \ \ \ \
\
\
\
\
\
\
\
\ \ \ \ \ \
\
\
\
\
\
\
\
\ \ \ \ \ \
\
\
\
\
\
\
\
\ \ \ \ \ \
\
\
\
\
\
\
\
\ \ \ \ \ \
\
\
\
\
\
\
\
\
\ 全部评价\ 好评 -- \ 中评 -- \ 差评 -- \
\
\
\
\
\ \ \ \ \ \
\
力荐:5分
\ \ 还可输入 60 个字\
\
\ 参与评分\
\
' ,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('点击选择图标评分等级1-5星'); $('.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: '
'+ $(this).html() +'
', 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('评分等级不能为空',{icon:2}); return false; } if(120 - getLength(_ps)<0){ layer.msg('评价信息不能超过60个字',{icon:2}); return false; } score.set_score_info({pid:_pid,num:_num,ps:_ps == ''?'用户未做任何评价': _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:'添加评论', area:['400px','350px'], closeBtn: 2, shadeClose: false, btn:['确认','取消'], content:'
\
\ \ \ \ \ \
\
(点击以上图标选择评分等级1-5)
\ \ 还可输入 60 个字\
', 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('(点击以上图标选择评分等级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('评分等级不能为空',{icon:2}); return false; } if(120 - getLength(_ps)<0){ layer.msg('评价信息不能超过60个字',{icon:2}); return false; } score.set_score_info({pid:_pid,num:_num,ps:_ps == ''?'用户未做任何评价': _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 '刚刚';} var minC = diffValue/minute, //计算时间差的分,时,天,周,月 hourC = diffValue/hour, dayC = diffValue/day, weekC = diffValue/week, monthC = diffValue/month, result ='刚刚'; if(monthC >= 1 && monthC <= 3){ result = " " + parseInt(monthC) + "月前" }else if(weekC >= 1 && weekC <= 3){ result = " " + parseInt(weekC) + "周前" }else if(dayC >= 1 && dayC <= 6){ result = " " + parseInt(dayC) + "天前" }else if(hourC >= 1 && hourC <= 23){ result = " " + parseInt(hourC) + "小时前" }else if(minC >= 1 && minC <= 59){ result =" " + parseInt(minC) + "分钟前" }else if(diffValue >= 0 && diffValue <= minute){ result = "刚刚" }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 = '刚刚' return ((result == undefined || result == 'undefined')?'刚刚':result); } // 规则转码 function escapeHTML(val) { val = "" + val; return val.replace(//g, ">").replace(/"/g, '"').replace(/'/g, "‘").replace(/\(/g, "(").replace(/\</g, "<").replace(/\>/g, ">").replace(/`/g, "`").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; }