var site = { get_list: function (page, search, type) { if (page == undefined) page = 1; if (type == '-1' || type == undefined) { type = $('.site_type select').val(); } if (!search) search = $("#SearchValue").val(); bt.site.get_list(page, search, type, function (rdata) { $('.dataTables_paginate').html(rdata.page); var data = rdata.data; var _tab = bt.render({ table: '#webBody', columns: [ { field: 'id', type: 'checkbox', width: 30 }, { field: 'name', title: '网站名', width: 150, templet: function (item) { return '' + item.name + ''; }, sort: function () { site.get_list(); } }, { field: 'status', title: '状态', width: 98, templet: function (item) { var _status = ''; _status += '运行中 '; } else { _status += ' onclick="bt.site.start(' + item.id + ',\'' + item.name + '\')"'; _status += '已停止 '; } return _status; }, sort: function () { site.get_list(); } }, { field: 'backup', title: '备份', width: 58, templet: function (item) { var backup = lan.site.backup_no; if (item.backup_count > 0) backup = lan.site.backup_yes; return '' + backup + ''; } }, { field: 'path', title: '根目录', width: '26%', templet: function (item) { var _path = bt.format_path(item.path); return '' + _path + ''; } }, { field: 'edate', title: '到期时间', width: 86, templet: function (item) { var _endtime = ''; if (item.edate) _endtime = item.edate; if (item.endtime) _endtime = item.endtime; _endtime = (_endtime == "0000-00-00") ? lan.site.web_end_time : _endtime return '' + _endtime + ''; }, sort: function () { site.get_list(); } }, { field: 'ps', title: '备注', templet: function (item) { return "" + item.ps + ""; } }, { field: 'opt', width: 260, title: '操作', align: 'right', templet: function (item) { var opt = ''; var _check = ' onclick="site.site_waf(\'' + item.name + '\')"'; if (bt.os == 'Linux') opt += '防火墙 | '; opt += '设置 | '; opt += '删除'; return opt; } }, ], data: data }) //设置到期时间 $('a.setTimes').each(function () { var _this = $(this); var _tr = _this.parents('tr'); var id = _this.attr('id'); laydate.render({ elem: '#' + id //指定元素 , min: bt.get_date(1) , max: '2099-12-31' , vlue: bt.get_date(365) , type: 'date' , format: 'yyyy-MM-dd' , trigger: 'click' , btns: ['perpetual', 'confirm'] , theme: '#20a53a' , done: function (dates) { var item = _tr.data('item'); bt.site.set_endtime(item.id, dates, function () { }) } }); }) //}) }); }, site_waf: function (siteName) { try { site_waf_config(siteName); } catch (err) { site.no_firewall(); } }, html_encode: function (html) { var temp = document.createElement("div"); //2.然后将要转换的字符串设置为这个元素的innerText(ie支持)或者textContent(火狐,google支持) (temp.textContent != undefined) ? (temp.textContent = html) : (temp.innerText = html); //3.最后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串了 var output = temp.innerHTML; temp = null; return output; }, get_types: function (callback) { bt.site.get_type(function (rdata) { var optionList = ''; for (var i = 0; i < rdata.length; i++) { optionList += '' } if($('.dataTables_paginate').next().hasClass('site_type')) $('.site_type').remove(); $('.dataTables_paginate').after('
站点分类:
'); $('.site_type select').change(function () { var val = $(this).val(); site.get_list(0, '', val); bt.set_cookie('site_type', val); }) if(callback) callback(rdata); }); }, no_firewall: function (obj) { var typename = bt.get_cookie('serverType'); layer.confirm(typename + '防火墙暂未开通,
请到"软件管理>付费插件>' + typename + '防火墙"
开通安装使用。', { title: typename + '防火墙未开通', icon: 7, closeBtn: 2, cancel: function () { if (obj) $(obj).prop('checked', false) } }, function () { window.location.href = '/soft'; }, function () { if (obj) $(obj).prop('checked', false) }) }, site_detail: function (id, siteName, page) { if (page == undefined) page = '1'; var loadT = bt.load(lan.public.the_get); bt.pub.get_data('table=backup&search=' + id + '&limit=5&type=0&tojs=site.site_detail&p=' + page, function (frdata) { loadT.close(); var ftpdown = ''; var body = ''; var port; frdata.page = frdata.page.replace(/'/g, '"').replace(/site.site_detail\(/g, "site.site_detail(" + id + ",'" + siteName + "',"); if ($('#SiteBackupList').length <= 0) { bt.open({ type: 1, skin: 'demo-class', area: '700px', title: lan.site.backup_title, closeBtn: 2, shift: 5, shadeClose: false, content: "
" }); } setTimeout(function () { $('.sitebackup_page').html(frdata.page); var _tab = bt.render({ table: '#SiteBackupList', columns: [ { field: 'name', title: '文件名称' }, { field: 'size', title: '文件大小', templet: function (item) { return bt.format_size(item.size); } }, { field: 'addtime', title: '备份时间' }, { field: 'opt', title: '操作', align: 'right', templet: function (item) { var _opt = '下载 | '; _opt += '删除' return _opt; } }, ], data: frdata.data }); $('#btn_data_backup').unbind('click').click(function () { bt.site.backup_data(id, function (rdata) { if (rdata.status) site.site_detail(id, siteName); }) }) }, 100) }); }, add_site: function () { bt.site.add_site(function (rdata) { if (rdata.siteStatus) { site.get_list(); var html = ''; var ftpData = ''; if (rdata.ftpStatus) { var list = []; list.push({ title: lan.site.user, val: rdata.ftpUser }); list.push({ title: lan.site.password, val: rdata.ftpPass }); var item = {}; item.title = lan.site.ftp; item.list = list; ftpData = bt.render_ps(item); } var sqlData = ''; if (rdata.databaseStatus) { var list = []; list.push({ title: lan.site.database_name, val: rdata.databaseUser }); list.push({ title: lan.site.user, val: rdata.databaseUser }); list.push({ title: lan.site.password, val: rdata.databasePass }); var item = {}; item.title = lan.site.database_txt; item.list = list; sqlData = bt.render_ps(item); } if (ftpData == '' && sqlData == '') { bt.msg({ msg: lan.site.success_txt, icon: 1 }) } else { bt.open({ type: 1, area: '600px', title: lan.site.success_txt, closeBtn: 2, shadeClose: false, content: "
" + ftpData + sqlData + "
", }); if ($(".success-msg").height() < 150) { $(".success-msg").find("img").css({ "width": "150px", "margin-top": "30px" }); } } } else { bt.msg(rdata); } }) }, set_default_page: function () { bt.open({ type: 1, area: '460px', title: lan.site.change_defalut_page, closeBtn: 2, shift: 0, content: '
' }); setTimeout(function () { $('.change-default button').click(function () { bt.site.get_default_path($(this).index(), function (path) { bt.pub.on_edit_file(0, path); }) }) }, 100) }, set_default_site: function () { bt.site.get_default_site(function (rdata) { var arrs = []; arrs.push({title:"未设置默认站点",value:'0'}) for (var i = 0; i < rdata.sites.length; i++) arrs.push({ title: rdata.sites[i].name, value: rdata.sites[i].name }) var form = { title: lan.site.default_site_yes, area: '530px', list: [{ title: lan.site.default_site, name: 'defaultSite', width: '300px', value: rdata.defaultSite, type: 'select', items: arrs }], btns: [ bt.form.btn.close(), bt.form.btn.submit('提交', function (rdata, load) { bt.site.set_default_site(rdata.defaultSite, function (rdata) { load.close(); bt.msg(rdata); }) }) ] } bt.render_form(form); $('.line').after($(bt.render_help([lan.site.default_site_help_1, lan.site.default_site_help_2])).addClass('plr20')); }) }, //PHP-CLI get_cli_version: function () { $.post('/config?action=get_cli_php_version', {}, function (rdata) { if (rdata.status === false) { layer.msg(rdata.msg, { icon: 2 }); return; } var _options = ''; for (var i = rdata.versions.length - 1; i >= 0; i--) { var ed = ''; if (rdata.select.version == rdata.versions[i].version) ed = 'selected' _options += ''; } var body = '
\
\ PHP-CLI版本\
\ \
\
\ \
'; layer.open({ type: 1, title: "设置PHP-CLI(命令行)版本" , area: '560px', closeBtn: 2, shadeClose: false, content: body }); }); }, set_cli_version: function () { var php_version = $("select[name='php_version']").val(); var loading = bt.load(); $.post('/config?action=set_cli_php_version', { php_version: php_version }, function (rdata) { loading.close(); if (rdata.status) { layer.closeAll(); } layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); }); }, del_site: function (wid, wname) { var thtml = "
"; bt.show_confirm(lan.site.site_del_title + "[" + wname + "]", lan.site.site_del_info, function () { var ftp = '', data = '', path = ''; var data = { id: wid, webname: wname } if ($("#delftp").is(":checked")) data.ftp = 1; if ($("#deldata").is(":checked")) data.database = 1; if ($("#delpath").is(":checked")) data.path = 1; bt.site.del_site(data, function (rdata) { if (rdata.status) site.get_list(); bt.msg(rdata); }) }, thtml); }, batch_site: function (type, obj, result) { if (obj == undefined) { obj = {}; var arr = []; result = { count: 0, error_list: [] }; $('input[type="checkbox"].check:checked').each(function () { var _val = $(this).val(); if (!isNaN(_val)) arr.push($(this).parents('tr').data('item')); }) if (type == 'site_type') { bt.site.get_type(function (tdata) { var types = []; for (var i = 0; i < tdata.length; i++) types.push({ title: tdata[i].name, value: tdata[i].id }) var form = { title: '设置站点分类', area: '530px', list: [{ title: lan.site.default_site, name: 'type_id', width: '300px', type: 'select', items: types }], btns: [ bt.form.btn.close(), bt.form.btn.submit('提交', function (rdata, load) { var ids = [] for (var x = 0; x < arr.length; x++) ids.push(arr[x].id); bt.site.set_site_type({ id: rdata.type_id, site_array: JSON.stringify(ids) }, function (rrdata) { if (rrdata.status) { load.close(); site.get_list(); } bt.msg(rrdata); }) }) ] } bt.render_form(form); }) return; } var thtml = "
"; bt.show_confirm(lan.site.all_del_site, "" + lan.get('del_all_site', [arr.length]) + "", function () { if ($("#delpath").is(":checked")) obj.path = '1'; obj.data = arr; bt.closeAll(); site.batch_site(type, obj, result); }, thtml); return; } var item = obj.data[0]; switch (type) { case 'del': if (obj.data.length < 1) { site.get_list(); bt.msg({ msg: lan.get('del_all_site_ok', [result.count]), icon: 1, time: 5000 }); return; } var data = { id: item.id, webname: item.name, path: obj.path } bt.site.del_site(data, function (rdata) { if (rdata.status) { result.count += 1; } else { result.error_list.push({ name: item.item, err_msg: rdata.msg }); } obj.data.splice(0, 1) site.batch_site(type, obj, result); }) break; } }, set_class_type: function () { var _form_data = bt.render_form_line({ title: '', items: [ { placeholder: '请填写分类名称', name: 'type_name', width: '50%', type: 'text' }, { name: 'btn_submit', text: '添加', type: 'button', callback: function (sdata) { bt.site.add_type(sdata.type_name, function (ldata) { if (ldata.status){ $('[name="type_name"]').val(''); site.get_class_type(); } bt.msg(ldata); }) } } ] }); bt.open({ type: 1, area: '350px', title: '网站分类管理', closeBtn: 2, shift: 5, shadeClose: true, content: "
" + _form_data.html + "
", success:function(){ bt.render_clicks(_form_data.clicks); site.get_class_type(function(res){ $('#type_table').on('click','.del_type',function(){ var _this = $(this); var item = _this.parents('tr').data('item'); if (item.id == 0) { bt.msg({ icon: 2, msg: '默认分类不可删除/不可编辑!' }); return; } bt.confirm({ msg: "是否确定删除分类?", title: '删除分类【'+ item.name +'】' }, function () { bt.site.del_type(item.id, function (ret) { if (ret.status) { site.get_class_type(); bt.set_cookie('site_type', '-1'); } bt.msg(ret); }) }) }); $('#type_table').on('click','.edit_type',function(){ var item = $(this).parents('tr').data('item'); if (item.id == 0) { bt.msg({ icon: 2, msg: '默认分类不可删除/不可编辑!' }); return; } bt.render_form({ title: '修改分类管理【' + item.name + '】', area: '350px', list: [{ title: '分类名称', width: '150px', name: 'name', value: item.name }], btns: [ { title: '关闭', name: 'close' }, { title: '提交', name: 'submit', css: 'btn-success', callback: function (rdata, load, callback) { bt.site.edit_type({ id: item.id, name: rdata.name }, function (edata) { if (edata.status) { load.close(); site.get_class_type(); } bt.msg(edata); }) } } ] }); }); }); } }); }, get_class_type: function(callback){ site.get_types(function(rdata){ bt.render({ table: '#type_table', columns: [ { field: 'name', title: '名称' }, { field: 'opt', width: '80px', title: '操作', templet: function (item) { return '编辑 | 删除'; } } ], data: rdata }); $('.layui-layer-page').css({ 'margin-top':'-' + ($('.layui-layer-page').height() / 2) +'px','top':'50%' }); if(callback) callback(rdata); }); }, ssl: { my_ssl_msg : null, //续签订单内 renew_ssl: function (siteName,auth_type,index) { acme.siteName = siteName; if(index.length === 32 && index.indexOf('/') === -1){ acme.renew(index,function(rdata) { site.ssl.ssl_result(rdata,auth_type,siteName) }); }else{ acme.get_cert_init(index,siteName,function(cert_init){ acme.domains = cert_init.dns; var options = ''; for(var i=0;iDNS验证 - '+cert_init.dnsapi[i].title+''; } acme.select_loadT = layer.open({ title: '续签Let\'s Encrypt证书', type:1, closeBtn:2, shade: 0.3, area: "500px", offset: "30%", content: '
\
\ 请选择验证方式\
\ \ \ \
\
\ \
', success:function(layers){ $("select[name='auth_to']").change(function(){ var dnsapi = $(this).val(); $(".dnsapi-btn").html(''); for(var i=0;i设置'); if(cert_init.dnsapi[i].data[0].value || cert_init.dnsapi[i].data[1].value) break; site.ssl.show_dnsapi_setup(); } }); } }); }); } }, //续签其它 renew_ssl_other: function(){ var auth_to = $("select[name='auth_to']").val() var auth_type = 'http' if(auth_to === 'http'){ if(JSON.stringify(acme.domains).indexOf('*.') !== -1){ layer.msg("包含通配符的域名不能使用文件验证(HTTP)!",{icon:2}); return; } auth_to = acme.id }else{ if(auth_to !== 'dns'){ if(auth_to === "Dns_com"){ acme.dnsapi.data = [{value:"None"},{value:"None"}]; } if(!acme.dnsapi.data[0].value || !acme.dnsapi.data[1].value){ layer.msg("请先设置【"+acme.dnsapi.title+"】接口信息!",{icon:2}); return; } auth_to = auth_to + '|' + acme.dnsapi.data[0].value + '|' + acme.dnsapi.data[1].value; } auth_type = 'dns' } layer.close(acme.select_loadT); acme.apply_cert(acme.domains,auth_type,auth_to,'0',function(rdata){ site.ssl.ssl_result(rdata,auth_type,acme.siteName); }); }, show_dnsapi_setup: function(){ var dnsapi = acme.dnsapi; acme.dnsapi_loadT = layer.open({ title: '设置【'+dnsapi.title+'】接口', type:1, closeBtn:0, shade: 0.3, area: "550px", offset: "30%", content: '
\
\ '+dnsapi.data[0].key+'\
\ \
\
\
\ '+dnsapi.data[1].key+'\
\ \
\
\
\ \ \
\
    \
  • '+dnsapi.help+'
  • \
\
', success:function(layers){ $(".dnsapi-save").click(function(){ var dnsapi_key = $(".dnsapi-key"); var dnsapi_token = $(".dnsapi-token"); pdata = {} pdata[dnsapi_key.attr("name")] = dnsapi_key.val(); pdata[dnsapi_token.attr("name")] = dnsapi_token.val(); acme.dnsapi.data[0].value = dnsapi_key.val(); acme.dnsapi.data[1].value = dnsapi_token.val(); bt.site.set_dns_api({ pdata: JSON.stringify(pdata) }, function (ret) { if(ret.status) layer.close(acme.dnsapi_loadT); bt.msg(ret); }); }); } }); }, set_cert: function(siteName,res){ var loadT = bt.load(lan.site.saving_txt); var pdata = { type:1, siteName:siteName, key:res.private_key, csr:res.cert + res.root } bt.send('SetSSL','site/SetSSL',pdata,function(rdata){ loadT.close(); site.reload(); layer.msg(res.msg,{icon:1}); }) }, show_error:function(res,auth_type){ var area_size = '500px'; var err_info = ""; if (!res.msg[1].challenges[1]) { if (res.msg[1].challenges[0]) { res.msg[1].challenges[1] = res.msg[1].challenges[0] } } if (res.msg[1].status === 'invalid') { area_size = '600px'; var trs = $("#dns_txt_jx tbody tr"); var dns_value = ""; for (var imd = 0; imd < trs.length; imd++) { if (trs[imd].outerText.indexOf(res.msg[1].identifier.value) == -1) continue; var s_tmp = trs[imd].outerText.split("\t") if (s_tmp.length > 1) { dns_value = s_tmp[1] break; } } err_info += "

验证域名:" + res.msg[1].identifier.value + "

" if(auth_type === 'dns'){ var check_url = "_acme-challenge." + res.msg[1].identifier.value err_info += "

验证解析:"+check_url+"

" err_info += "

验证内容:" + dns_value + "

" err_info += "

错误代码:" + site.html_encode(res.msg[1].challenges[1].error.detail) + "

" }else{ var check_url = "http://" + res.msg[1].identifier.value + '/.well-known/acme-challenge/' + res.msg[1].challenges[0].token err_info += "

验证URL:点击查看

" err_info += "

验证内容:" + res.msg[1].challenges[0].token + "

" err_info += "

错误代码:" + site.html_encode(res.msg[1].challenges[0].error.detail) + "

" } err_info += "

验证结果: 验证失败

" layer.msg('
' + res.msg[0]+ '' + err_info + '
', { icon: 2, time: 0, shade:0.3, shadeClose: true, area: area_size }); } }, ssl_result: function(res,auth_type,siteName){ layer.close(acme.loadT); if(res.status === false && typeof(res.msg) === 'string'){ bt.msg(res); return; } if(res.status === true || res.status === 'pending' || res.save_path !== undefined){ if(auth_type == 'dns' && res.status === 'pending'){ var b_load = bt.open({ type: 1, area: '700px', title: '手动解析TXT记录', closeBtn: 2, shift: 5, shadeClose: false, content: "
\

请按以下列表做TXT解析:

\
\
\ \
\
" }); //手动验证事件 $('.btn_check_txt').click(function () { acme.auth_domain(res.index,function(res1){ layer.close(acme.loadT); if(res1.status === true){ layer.close(b_load); site.ssl.set_cert(siteName,res1) }else{ site.ssl.show_error(res1,auth_type); } }) }); //显示手动验证信息 setTimeout(function () { var data = []; acme_txt = '_acme-challenge.' for (var j = 0; j < res.auths.length; j++) { data.push({ name: acme_txt + res.auths[j].domain.replace('*.',''), type:"TXT", txt: res.auths[j].auth_value, force:"是" }); data.push({ name: res.auths[j].domain.replace('*.',''), type:"CAA", txt: '0 issue "letsencrypt.org"', force:"否" }); } bt.render({ table: '#dns_txt_jx', columns: [ { field: 'name', width: '220px', title: '解析域名' }, { field: 'txt', title: '记录值' }, { field: 'type', title: '类型' }, { field: 'force', title: '必需' } ], data: data }) $('.div_txt_jx').append(bt.render_help([ '解析域名需要一定时间来生效,完成所以上所有解析操作后,请等待1分钟后再点击验证按钮', '可通过CMD命令来手动验证域名解析是否生效: nslookup -q=txt ' + acme_txt + res.auths[0].domain.replace('*.',''), '若您使用的是宝塔云解析插件,阿里云DNS,DnsPod作为DNS,可使用DNS接口自动解析' ])); }); return; } site.ssl.set_cert(siteName,res) return; } site.ssl.show_error(res,auth_type); }, get_renew_stat: function () { $.post('/ssl?action=Get_Renew_SSL', {}, function (task_list) { if (!task_list.status) return; var s_body = ''; var b_stat = false; for (var i = 0; i < task_list.data.length; i++) { s_body += '

' + task_list.data[i].subject + ' >> ' + task_list.data[i].msg + '

'; if (task_list.data[i].status !== true && task_list.data[i].status !== false) { b_stat = true; } } if (site.ssl.my_ssl_msg) { $(".my-renew-ssl").html(s_body); } else { site.ssl.my_ssl_msg = layer.msg('
' + s_body + '
', { time: 0 ,icon:16,shade:0.3}); } if (!b_stat) { setTimeout(function () { layer.close(site.ssl.my_ssl_msg); site.ssl.my_ssl_msg = null; }, 3000); return; } setTimeout(function () { site.ssl.get_renew_stat(); }, 1000); }); }, onekey_ssl: function (partnerOrderId, siteName) { bt.site.get_ssl_info(partnerOrderId, siteName, function (rdata) { bt.msg(rdata); if (rdata.status) site.reload(7); }) }, set_ssl_status: function (action, siteName) { bt.site.set_ssl_status(action, siteName, function (rdata) { bt.msg(rdata); if (rdata.status) { site.reload(7); if (action == 'CloseSSLConf') { layer.msg(lan.site.ssl_close_info, { icon: 1, time: 5000 }); } } }) }, verify_domain: function (partnerOrderId, siteName) { bt.site.verify_domain(partnerOrderId, siteName, function (vdata) { bt.msg(vdata); if (vdata.status) { if (vdata.data.stateCode == 'COMPLETED') { site.ssl.onekey_ssl(partnerOrderId, siteName) } else { layer.msg('等待CA验证中,若长时间未能成功验证,请登录官网使用DNS方式重新申请...'); } } }) }, reload: function (index) { if (index == undefined) index = 0 var _sel = $('#ssl_tabs .on'); if (_sel.length == 0) _sel = $('#ssl_tabs span:eq(0)'); _sel.trigger('click'); } }, edit: { set_domains: function (web) { var _this = this; bt.site.get_domains(web.id, function (rdata) { var list = [ { items: [ { name: 'newdomain', width: '340px', type: 'textarea', placeholder: '每行填写一个域名,默认为80端口
泛解析添加方法 *.domain.com
如另加端口格式为 www.domain.com:88' }, { name: 'btn_submit_domain', text: '添加', type: 'button', callback: function (sdata) { var arrs = sdata.newdomain.split("\n"); var domins = ""; for (var i = 0; i < arrs.length; i++) domins += arrs[i] + ","; bt.site.add_domains(web.id, web.name, bt.rtrim(domins, ','), function (ret) { if (ret.status) site.reload(0) }) } } ] } ] var _form_data = bt.render_form_line(list[0]); $('#webedit-con').html(_form_data.html + "
"); bt.render_clicks(_form_data.clicks); $('.placeholder').css({ 'width':'340px', 'heigth':'100px','left': '0px', 'top': '0px', 'padding-top': '10px','padding-left': '15px'}); $('.btn_submit_domain').addClass('pull-right').css("margin", "30px 35px 0 0") $(".placeholder").click(function () { $(this).hide(); $('.newdomain').focus(); }) $('.domains').focus(function () { $(".placeholder").hide(); }); $('.domains').blur(function () { if ($(this).val().length == 0) $(".placeholder").show(); }); bt.render({ table: '#domain_table', columns: [ { field: 'name', title: '域名', templet: function (item) { return "" + item.name + "" } }, { field: 'port', width: '70px', title: '端口' }, { field: 'opt', width: '50px', title: '操作', templet: function (item) { return ''; } } ], data: rdata }) setTimeout(function () { $('.domain_del').click(function () { if ($(this).parents('tbody').find('tr').length == 1) { bt.msg({ msg: lan.site.domain_last_cannot, icon: 2 }); return; } var item = $(this).parents('tr').data('item'); bt.confirm({title:'删除域名【'+ item.name +'】', msg: lan.site.domain_del_confirm }, function () { bt.site.del_domain(web.id, web.name, item.name, item.port, function (ret) { if (ret.status) site.reload(0) }) }) }) }, 100) }) }, set_dirbind: function (web) { var _this = this; bt.site.get_dirbind(web.id, function (rdata) { var dirs = []; for (var n = 0; n < rdata.dirs.length; n++) dirs.push({ title: rdata.dirs[n], value: rdata.dirs[n] }); var data = { title: '', items: [ { title: '域名', width: '140px', name: 'domain' }, { title: '子目录', name: 'dirName', type: 'select', items: dirs }, { text: '添加', type: 'button', name: 'btn_add_subdir', callback: function (sdata) { if (!sdata.domain || !sdata.dirName) { layer.msg(lan.site.d_s_empty, { icon: 2 }); return; } bt.site.add_dirbind(web.id, sdata.domain, sdata.dirName, function (ret) { layer.msg(ret.msg, { icon: ret.status ? 1 : 2 }); if (ret.status) site.reload(1) }) } } ] } var _form_data = bt.render_form_line(data); $('#webedit-con').html(_form_data.html + '
'); bt.render_clicks(_form_data.clicks); bt.render({ table: '#sub_dir_table', columns: [ { field: 'domain', title: '域名' }, { field: 'port', width: '70px', title: '端口' }, { field: 'path', width: '100px', title: '子目录' }, { field: 'opt', width: '100px', align: 'right', title: '操作', templet: function (item) { return '伪静态 | 删除'; } } ], data: rdata.binding }) setTimeout(function () { $('#sub_dir_table td a').click(function () { var item = $(this).parents('tr').data('item'); if ($(this).hasClass('del')) { bt.confirm({ msg: lan.site.s_bin_del }, function () { bt.site.del_dirbind(item.id, function (ret) { if (ret.status) site.reload(1) }) }) } else { bt.site.get_dir_rewrite({ id: item.id }, function (ret) { if (!ret.status) { var confirmObj = layer.confirm(lan.site.url_rewrite_alter, { icon: 3, closeBtn: 2 }, function () { bt.site.get_dir_rewrite({ id: item.id, add: 1 }, function (ret) { layer.close(confirmObj); show_dir_rewrite(ret); }); }); return; } show_dir_rewrite(ret); function show_dir_rewrite(ret) { var arrs = []; for (var i = 0; i < ret.rlist.length; i++) arrs.push({ title: ret.rlist[i], value: ret.rlist[i] }); var datas = [{ name: 'dir_rewrite', type: 'select', width: '130px', items: arrs, callback: function (obj) { var spath = '/www/server/panel/rewrite/' + bt.get_cookie('serverType') + '/' + obj.val() + '.conf'; bt.files.get_file_body(spath, function (sdata) { $('.dir_config').text(sdata.data); }) } }, { items: [{ name: 'dir_config', type: 'textarea', value: ret.data, width: '470px', height: '260px' }] }, { items: [{ name: 'btn_save', text: '保存', type: 'button', callback: function (ldata) { bt.files.set_file_body(ret.filename, ldata.dir_config, 'utf-8', function (sdata) { if (sdata.status) load_form.close(); bt.msg(sdata); }) } }] }] var load_form = bt.open({ type: 1, area: '510px', title: lan.site.config_url, closeBtn: 2, shift: 5, skin: 'bt-w-con', shadeClose: true, content: "
" }); setTimeout(function () { var _html = $(".webedit-dir-box") var clicks = []; for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); _html.append(_form_data.html); var _other = (bt.os == 'Linux' && i == 0) ? '规则转换工具:Apache转Nginx' : ''; _html.find('.info-r').append(_other) clicks = clicks.concat(_form_data.clicks); } _html.append(bt.render_help(['请选择您的应用,若设置伪静态后,网站无法正常访问,请尝试设置回default', '您可以对伪静态规则进行修改,修改完后保存即可。'])); bt.render_clicks(clicks); }, 100) } }) } }) }, 100) }) }, set_dirpath: function (web) { var loading = bt.load(); bt.site.get_site_path(web.id, function (path) { bt.site.get_dir_userini(web.id, path, function (rdata) { loading.close(); var dirs = []; var is_n = false; for (var n = 0; n < rdata.runPath.dirs.length; n++) { dirs.push({ title: rdata.runPath.dirs[n], value: rdata.runPath.dirs[n] }); if (rdata.runPath.runPath === rdata.runPath.dirs[n]) is_n = true; } if (!is_n) dirs.push({ title: rdata.runPath.runPath, value: rdata.runPath.runPath }); var datas = [ { title: '', items: [ { name: 'userini', type: 'checkbox', text: '防跨站攻击(open_basedir)', value: rdata.userini, callback: function (sdata) { bt.site.set_dir_userini(path, function (ret) { if (ret.status) site.reload(2) layer.msg(ret.msg, { icon: ret.status ? 1 : 2 }); }) } }, { name: 'logs', type: 'checkbox', text: '写访问日志', value: rdata.logs, callback: function (sdata) { bt.site.set_logs_status(web.id, function (ret) { if (ret.status) site.reload(2) layer.msg(ret.msg, { icon: ret.status ? 1 : 2 }); }) } } ] }, { title: '', items: [ { name: 'path', title: '网站目录', width: '50%', value: path, event: { css: 'glyphicon-folder-open', callback: function (obj) { bt.select_path(obj); } } }, { name: 'btn_site_path', type: 'button', text: '保存', callback: function (pdata) { bt.site.set_site_path(web.id, pdata.path, function (ret) { if (ret.status) site.reload(2) layer.msg(ret.msg, { icon: ret.status ? 1 : 2 }); }) } } ] }, { title: '', items: [ { title: '运行目录', width: '50%', value: rdata.runPath.runPath, name: 'dirName', type: 'select', items: dirs }, { name: 'btn_run_path', type: 'button', text: '保存', callback: function (pdata) { bt.site.set_site_runpath(web.id, pdata.dirName, function (ret) { if (ret.status) site.reload(2) layer.msg(ret.msg, { icon: ret.status ? 1 : 2 }); }) } } ] } ] var _html = $("
") var clicks = []; for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); _html.append($(_form_data.html).addClass('line mtb10')); clicks = clicks.concat(_form_data.clicks); } _html.find('input[type="checkbox"]').parent().addClass('label-input-group ptb10'); _html.find('button[name="btn_run_path"]').addClass('ml45'); _html.find('button[name="btn_site_path"]').addClass('ml33'); _html.append(bt.render_help(['部分程序需要指定二级目录作为运行目录,如ThinkPHP5,Laravel', '选择您的运行目录,点保存即可'])); if (bt.os == 'Linux') _html.append('
密码访问
') $('#webedit-con').append(_html); bt.render_clicks(clicks); $('#pathSafe').click(function () { var val = $(this).prop('checked'); var _div = $('.user_pw') if (val) { var dpwds = [ { title: '授权账号', width: '200px', name: 'username_get', placeholder: '不修改请留空' }, { title: '访问密码', width: '200px', type: 'password', name: 'password_get_1', placeholder: '不修改请留空' }, { title: '重复密码', width: '200px', type: 'password', name: 'password_get_2', placeholder: '不修改请留空' }, { name: 'btn_password_get', text: '保存', type: 'button', callback: function (rpwd) { if (rpwd.password_get_1 != rpwd.password_get_2) { layer.msg(lan.bt.pass_err_re, { icon: 2 }); return; } bt.site.set_site_pwd(web.id, rpwd.username_get, rpwd.password_get_1, function (ret) { layer.msg(ret.msg, {icon:ret.status?1:2}) if (ret.status) site.reload(2) }) } } ] for (var i = 0; i < dpwds.length; i++) { var _from_pwd = bt.render_form_line(dpwds[i]); _div.append("
" + _from_pwd.html + "
"); bt.render_clicks(_from_pwd.clicks); } } else { bt.site.close_site_pwd(web.id, function (rdata) { layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); _div.html(''); }) } }) if (rdata.pass) $('#pathSafe').trigger('click'); }) }) }, set_dirguard: function(web){ String.prototype.myReplace = function (f, e) {//吧f替换成e var reg = new RegExp(f, "g"); //创建正则RegExp对象 return this.replace(reg, e); } bt.site.get_dir_auth(web.id,function(res) { var datas = { items: [{ name: 'add_dir_guard',text:'添加目录保护',type: 'button',callback: function(data){site.edit.template_Dir(web.id,true)}}] } var form_line = bt.render_form_line(datas); $('#webedit-con').append(form_line.html); bt.render_clicks(form_line.clicks); $('#webedit-con').addClass('divtable').append('
'); setTimeout(function() { var data = []; var _tab = bt.render({ table: '#dir_guard', columns: [ { field: 'name', title: '名称', template: function(item) { return ''+ item.name +'' } }, { field: 'site_dir', title: '保护的目录', template: function(item) { return ''+ item.site_dir +'' } }, { field: 'dname', title: '操作', align: 'right', templet: function (item) { var dirName = item.name item = JSON.stringify(item).myReplace('"', '\''); var conter = '编辑 ' + '| 删除'; return conter } } ], data:res[web.name] || [] }) }) }); }, limit_network: function (web) { bt.site.get_limitnet(web.id, function (rdata) { var limits = [ { title: '论坛/博客', value: 1, items: { perserver: 300, perip: 25, limit_rate: 512 } }, { title: '图片站', value: 2, items: { perserver: 200, perip: 10, limit_rate: 1024 } }, { title: '下载站', value: 3, items: { perserver: 50, perip: 3, limit_rate: 2048 } }, { title: '商城', value: 4, items: { perserver: 500, perip: 10, limit_rate: 2048 } }, { title: '门户', value: 5, items: { perserver: 400, perip: 15, limit_rate: 1024 } }, { title: '企业', value: 6, items: { perserver: 60, perip: 10, limit_rate: 512 } }, { title: '视频', value: 7, items: { perserver: 150, perip: 4, limit_rate: 1024 } } ] var datas = [ { items: [{ name: 'status', type: 'checkbox', value: rdata.perserver != 0 ? true : false, text: '启用流量控制', callback: function (ldata) { if (ldata.status) { bt.site.set_limitnet(web.id, ldata.perserver, ldata.perip, ldata.limit_rate, function (ret) { layer.msg(ret.msg, { icon: ret.status ? 1 : 2 }); if (ret.status) site.reload(3) }) } else { bt.site.close_limitnet(web.id, function (ret) { layer.msg(ret.msg, { icon: ret.status ? 1 : 2 }); if (ret.status) site.reload(3) }) } } }] }, { items: [{ title: '限制方案 ', width: '160px', name: 'limit', type: 'select', items: limits, callback: function (obj) { var data = limits.filter(function (p) { return p.value === parseInt(obj.val()); })[0] for (var key in data.items) $('input[name="' + key + '"]').val(data.items[key]); } }] }, { items: [{ title: '并发限制 ', type: 'number', width: '200px', value: rdata.perserver, name: 'perserver' }] }, { items: [{ title: '单IP限制 ', type: 'number', width: '200px', value: rdata.perip, name: 'perip' }] }, { items: [{ title: '流量限制 ', type: 'number', width: '200px', value: rdata.limit_rate, name: 'limit_rate' }] }, { name: 'btn_limit_get', text: '保存', type: 'button', callback: function (ldata) { bt.site.set_limitnet(web.id, ldata.perserver, ldata.perip, ldata.limit_rate, function (ret) { layer.msg(ret.msg, { icon: ret.status ? 1 : 2 }); if (ret.status) site.reload(3) }) } } ] var _html = $("
") var clicks = []; for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); _html.append(_form_data.html); clicks = clicks.concat(_form_data.clicks); } _html.find('input[type="checkbox"]').parent().addClass('label-input-group ptb10'); _html.append(bt.render_help(['限制当前站点最大并发数', '限制单个IP访问最大并发数', '限制每个请求的流量上限(单位:KB)'])); $('#webedit-con').append(_html); bt.render_clicks(clicks); if (rdata.perserver == 0) $("select[name='limit']").trigger("change") }) }, get_rewrite_list: function (web) { var filename = '/www/server/panel/vhost/rewrite/' + web.name + '.conf'; bt.site.get_rewrite_list(web.name, function (rdata) { if (bt.get_cookie('serverType') == 'apache') filename = rdata.sitePath + '/.htaccess'; var arrs = []; for (var i = 0; i < rdata.rewrite.length; i++) arrs.push({ title: rdata.rewrite[i], value: rdata.rewrite[i] }); var datas = [{ name: 'rewrite', type: 'select', width: '130px', items: arrs, callback: function (obj) { if (bt.os == 'Linux') { var spath = filename; if (obj.val() != lan.site.rewritename) spath = '/www/server/panel/rewrite/' + bt.get_cookie('serverType') + '/' + obj.val() + '.conf'; bt.files.get_file_body(spath, function (ret) { editor.setValue(ret.data); }) } } }, { items: [{ name: 'config', type: 'textarea', value: rdata.data, widht: '340px', height: '200px' }] }, { items: [{ name: 'btn_save', text: '保存', type: 'button', callback: function (ldata) { bt.files.set_file_body(filename, editor.getValue(), 'utf-8', function (ret) { if (ret.status) site.reload(4) bt.msg(ret); }) } }, { name: 'btn_save_to', text: '另存为模板', type: 'button', callback: function (ldata) { var temps = { title: lan.site.save_rewrite_temp, area: '330px', list: [ { title: '模板名称', placeholder: '模板名称', width: '160px', name: 'tempname' } ], btns: [ { title: '关闭', name: 'close' }, { title: '提交', name: 'submit', css: 'btn-success', callback: function (rdata, load, callback) { bt.site.set_rewrite_tel(rdata.tempname, editor.getValue(), function (rRet) { if (rRet.status) { load.close(); site.reload(4) } bt.msg(rRet); }) } } ] } bt.render_form(temps); } }] } ] var _html = $("
") var clicks = []; for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); _html.append(_form_data.html); var _other = (bt.os == 'Linux' && i == 0) ? '规则转换工具:Apache转Nginx' : ''; _html.find('.info-r').append(_other) clicks = clicks.concat(_form_data.clicks); } _html.append(bt.render_help(['请选择您的应用,若设置伪静态后,网站无法正常访问,请尝试设置回default', '您可以对伪静态规则进行修改,修改完后保存即可。'])); $('#webedit-con').append(_html); bt.render_clicks(clicks); $('textarea.config').attr('id', 'config_rewrite'); var editor = CodeMirror.fromTextArea(document.getElementById("config_rewrite"), { extraKeys: { "Ctrl-Space": "autocomplete" }, lineNumbers: true, matchBrackets: true, }); $(".CodeMirror-scroll").css({ "height": "340px", "margin": 0, "padding": 0 }); $(".soft-man-con .CodeMirror").css({ "height": "342px" }); setTimeout(function () { editor.refresh(); }, 250); $('select.rewrite').trigger('change') }) }, set_default_index: function (web) { bt.site.get_index(web.id, function (rdata) { rdata = rdata.replace(new RegExp(/(,)/g), "\n"); var data = { items: [ { name: 'Dindex', height: '230px', width: '50%', type: 'textarea', value: rdata }, { name: 'btn_submit', text: '添加', type: 'button', callback: function (ddata) { var Dindex = ddata.Dindex.replace(new RegExp(/(\n)/g), ","); bt.site.set_index(web.id, Dindex, function (ret) { if (ret.status) site.reload(5) }) } } ] } var _form_data = bt.render_form_line(data); var _html = $(_form_data.html) _html.append(bt.render_help([lan.site.default_doc_help])) $('#webedit-con').append(_html); $('.btn_submit').addClass('pull-right').css("margin", "90px 100px 0 0") bt.render_clicks(_form_data.clicks); }) }, set_config: function (web) { bt.site.get_site_config(web.name, function (rdata) { if (!rdata.status) { bt.msg(rdata); return; } var datas = [ { items: [{ name: 'site_config', type: 'textarea', value: rdata.data, widht: '340px', height: '200px' }] }, { name: 'btn_config_submit', text: '保存', type: 'button', callback: function (ddata) { bt.site.set_site_config(web.name, editor.getValue(), rdata.encoding, function (ret) { if (ret.status) site.reload(6) bt.msg(ret); }) } } ] var robj = $('#webedit-con'); for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } robj.append(bt.render_help([lan.site.web_config_help])); $('textarea.site_config').attr('id', 'configBody'); var editor = CodeMirror.fromTextArea(document.getElementById("configBody"), { extraKeys: { "Ctrl-Space": "autocomplete" }, lineNumbers: true, matchBrackets: true, }); $(".CodeMirror-scroll").css({ "height": "400px", "margin": 0, "padding": 0 }); }) }, set_ssl: function (web) { $('#webedit-con').html("
"); bt.site.get_site_ssl(web.name, function (rdata) { var _tabs = [ { title: '宝塔SSL', on: true, callback: function (robj) { bt.pub.get_user_info(function (udata) { if (udata.status) { bt.site.get_domains(web.id, function (ddata) { var domains = []; for (var i = 0; i < ddata.length; i++) { if (ddata[i].name.indexOf('*') == -1) domains.push({ title: ddata[i].name, value: ddata[i].name }); } var arrs1 = [ { title: '域名', width: '200px', name: 'domains', type: 'select', items: domains }, { title: ' ', name: 'btsslApply', text: '申请', type: 'button', callback: function (sdata) { if (sdata.domains.indexOf('www.') != -1) { var rootDomain = sdata.domains.split(/www\./)[1]; if (!$.inArray(domains, rootDomain)) { layer.msg('您为域名[' + sdata.domains + ']申请证书,但程序检测到您没有将其根域名[' + rootDomain + ']绑定并解析到站点,这会导致证书签发失败!', { icon: 2, time: 5000 }); return; } } bt.site.get_dv_ssl(sdata.domains, web.path, function (tdata) { bt.msg(tdata); if (tdata.status) site.ssl.verify_domain(tdata.data.partnerOrderId, web.name); }) } } ] for (var i = 0; i < arrs1.length; i++) { var _form_data = bt.render_form_line(arrs1[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } var loading = bt.load() bt.site.get_order_list(web.name, function (odata) { loading.close(); if (odata.status === false) { layer.msg(odata.msg, { icon: 2 }); return; } robj.append("
"); bt.render({ table: '#bt_order_list', columns: [ { field: 'commonName', title: '域名' }, { field: 'endtime', width: '70px', title: '到期时间', templet: function (item) { return bt.format_data(item.endtime, 'yyyy/MM/dd'); } }, { field: 'stateName', width: '100px', title: '状态' }, { field: 'opt', align: 'right', width: '100px', title: '操作', templet: function (item) { var opt = '部署' if (item.stateCode == 'WF_DOMAIN_APPROVAL') { opt = '验证域名'; } else { if (item.setup) opt = '已部署 | 关闭' } return opt; } } ], data: odata.data }) bt.fixed_table('bt_order_list'); var helps = [ '申请之前,请确保域名已解析,如未解析会导致审核失败(包括根域名)', '宝塔SSL申请的是免费版TrustAsia DV SSL CA - G5证书,仅支持单个域名申请', '有效期1年,不支持续签,到期后需要重新申请', '建议使用二级域名为www的域名申请证书,此时系统会默认赠送顶级域名为可选名称', '在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点', '如果重新申请证书时提示【订单已存在】请登录宝塔官网删除对应SSL订单', '如果您的站点有使用CDN、高防IP、反向代理、301重定向等功能,可能导致验证失败', '申请www.bt.cn这种以www为二级域名的证书,需绑定并解析顶级域名(bt.cn),否则将验证失败', ] robj.append(bt.render_help(helps)); }) }) } else { robj.append('
未绑定宝塔账号,请注册绑定,绑定宝塔账号(非论坛账号)可实现一键部署SSL
'); var datas = [ { title: '宝塔账号', name: 'bt_username', value: rdata.email, width: '260px', placeholder: '请输入手机号码' }, { title: '密码', type: 'password', name: 'bt_password', value: rdata.email, width: '260px' }, { title: ' ', items: [ { text: '登录', name: 'btn_ssl_login', type: 'button', callback: function (sdata) { bt.pub.login_btname(sdata.bt_username, sdata.bt_password, function (ret) { if (ret.status) site.reload(7); }) } }, { text: '注册宝塔账号', name: 'bt_register', type: 'button', callback: function (sdata) { window.open('https://www.bt.cn/register.html') } } ] } ] for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } robj.append(bt.render_help(['宝塔SSL证书为亚洲诚信证书,需要实名认证才能申请使用', '已有宝塔账号请登录绑定', '宝塔SSL申请的是TrustAsia DV SSL CA - G5 原价:1900元/1年,宝塔用户免费!', '一年满期后免费颁发'])); } }) } }, { title: "Let's Encrypt", callback: function (robj) { acme.get_account_info(function(let_user){}); acme.id = web.id; if (rdata.status && rdata.type == 1) { var cert_info = ''; if (rdata.cert_data['notBefore']) { cert_info = '
\

已部署成功:将在距离到期时间1个月内尝试自动续签\ \ 证书品牌:'+ rdata.cert_data.issuer+'

\ 认证域名: ' + rdata.cert_data.dns.join('、') + '\ 到期时间: ' + rdata.cert_data.notAfter + '
' } robj.append('
' + cert_info + '
密钥(KEY)证书(PEM格式)
'); var datas = [ { items: [ { name: 'key', width: '45%', height: '220px', type: 'textarea', value: rdata.key }, { name: 'csr', width: '45%', height: '220px', type: 'textarea', value: rdata.csr } ] }, { items: [ { text: '关闭SSL', name: 'btn_ssl_close', hide: !rdata.status, type: 'button', callback: function (sdata) { site.ssl.set_ssl_status('CloseSSLConf', web.name); } }, { text: '续签', name: 'btn_ssl_renew', hide: !rdata.status, type: 'button', callback: function (sdata) { site.ssl.renew_ssl(web.name,rdata.auth_type,rdata.index); } } ] } ] for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } robj.find('textarea').css('background-color', '#f6f6f6').attr('readonly', true); var helps = [ '申请之前,请确保域名已解析,如未解析会导致审核失败(包括根域名)', '宝塔SSL申请的是免费版TrustAsia DV SSL CA - G5证书,仅支持单个域名申请', '有效期1年,不支持续签,到期后需要重新申请', '建议使用二级域名为www的域名申请证书,此时系统会默认赠送顶级域名为可选名称', '在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点', '如果重新申请证书时提示【订单已存在】请登录宝塔官网删除对应SSL订单', ] robj.append(bt.render_help(['已为您自动生成Let\'s Encrypt免费证书;', '如需使用其他SSL,请切换其他证书后粘贴您的KEY以及PEM内容,然后保存即可。'])); return; } bt.site.get_site_domains(web.id, function (ddata) { var helps = [[ '申请之前,请确保域名已解析,如未解析会导致审核失败', 'Let\'s Encrypt免费证书,有效期3个月,支持多域名。默认会自动续签', '若您的站点使用了CDN或301重定向会导致续签失败', '在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点' ], [ '在DNS验证中,我们提供了多种自动化DNS-API,并提供了手动模式', '使用DNS接口申请证书可自动续期,手动模式下证书到期后需重新申请', '使用【DnsPod/阿里云DNS】等接口前您需要先在弹出的窗口中设置对应接口的API' ]] var datas = [ { title: '验证方式', items: [ { name: 'check_file', text: '文件验证', type: 'radio', callback: function (obj) { $('.checks_line').remove() $(obj).siblings().removeAttr('checked'); $('.help-info-text').html($(bt.render_help(helps[0]))); //var _form_data = bt.render_form_line({ title: ' ', class: 'checks_line label-input-group', items: [{ name: 'force', type: 'checkbox', value: true, text: '提前校验域名(提前发现问题,减少失败率)' }] }); //$(obj).parents('.line').append(_form_data.html); $('#ymlist li input[type="checkbox"]').each(function () { if ($(this).val().indexOf('*') >= 0) { $(this).parents('li').hide(); } }) } }, { name: 'check_dns', text: 'DNS验证(支持通配符)', type: 'radio', callback: function (obj) { $('.checks_line').remove(); $(obj).siblings().removeAttr('checked'); $('.help-info-text').html($(bt.render_help(helps[1]))); $('#ymlist li').show(); var arrs_list = [], arr_obj = {}; bt.site.get_dns_api(function (api) { site.dnsapi = {} for (var x = 0; x < api.length; x++) { site.dnsapi[api[x].name] = {} site.dnsapi[api[x].name].s_key = "None" site.dnsapi[api[x].name].s_token = "None" if(api[x].data){ site.dnsapi[api[x].name].s_key = api[x].data[0].value site.dnsapi[api[x].name].s_token = api[x].data[1].value } arrs_list.push({ title: api[x].title, value: api[x].name}); arr_obj[api[x].name] = api[x]; } var data = [{ title: '选择DNS接口', class: 'checks_line', items: [ { name: 'dns_select', width: '120px', type: 'select', items: arrs_list, callback: function (obj) { var _val = obj.val(); $('.set_dns_config').remove(); var _val_obj = arr_obj[_val]; var _form = { title: '', area: '530px', list: [], btns: [{ title: '关闭', name: 'close' }] }; var helps = []; if (_val_obj.data !== false) { _form.title = '设置【' + _val_obj.title + '】接口'; helps.push(_val_obj.help); var is_hide = true; for (var i = 0; i < _val_obj.data.length; i++) { _form.list.push({ title: _val_obj.data[i].name, name: _val_obj.data[i].key, value: _val_obj.data[i].value }) if (!_val_obj.data[i].value) is_hide = false; } _form.btns.push({ title: '保存', css: 'btn-success', name: 'btn_submit_save', callback: function (ldata, load) { bt.site.set_dns_api({ pdata: JSON.stringify(ldata) }, function (ret) { if (ret.status) { load.close(); robj.find('input[type="radio"]:eq(0)').trigger('click') robj.find('input[type="radio"]:eq(1)').trigger('click') } bt.msg(ret); }) } }) if (is_hide) { obj.after(''); $('.set_dns_config').click(function () { var _bs = bt.render_form(_form); $('div[data-id="form' + _bs + '"]').append(bt.render_help(helps)); }) } else { var _bs = bt.render_form(_form); $('div[data-id="form' + _bs + '"]').append(bt.render_help(helps)); } } } }, ] } , { title: ' ', class: 'checks_line label-input-group', items: [ { css: 'label-input-group ptb10', text: '自动组合泛域名', name: 'app_root', type: 'checkbox' } ] } ] for (var i = 0; i < data.length; i++) { var _form_data = bt.render_form_line(data[i]); $(obj).parents('.line').append(_form_data.html) bt.render_clicks(_form_data.clicks); } }) } }, ] } ] for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } var _ul = $(''); for (var i = 0; i < ddata.domains.length; i++) { if (ddata.domains[i].binding === true) continue _ul.append('
  • ' + ddata.domains[i].name + '
  • '); } var _line = $("
    "); _line.append('域名'); _line.append(_ul); robj.append(_line); robj.find('input[type="radio"]').parent().addClass('label-input-group ptb10'); $("#ymlist li input").click(function (e) { e.stopPropagation(); }) $("#ymlist li").click(function () { var o = $(this).find("input"); if (o.prop("checked")) { o.prop("checked", false) } else { o.prop("checked", true); } }) var _btn_data = bt.render_form_line({ title: ' ', text: '申请', name: 'letsApply', type: 'button', callback: function (ldata) { ldata['domains'] = []; $('#ymlist input[type="checkbox"]:checked').each(function () { ldata['domains'].push($(this).val()) }) var auth_type = 'http' var auth_to = web.id var auto_wildcard = '0' if(ldata.check_dns){ auth_type = 'dns' auth_to = 'dns' if(ldata.dns_select !== auth_to){ if(!site.dnsapi[ldata.dns_select].s_key){ layer.msg("指定dns接口没有设置密钥信息"); return; } auth_to = ldata.dns_select + "|" + site.dnsapi[ldata.dns_select].s_key + "|" + site.dnsapi[ldata.dns_select].s_token; auto_wildcard = ldata.app_root?'1':'0' } } acme.apply_cert(ldata['domains'],auth_type,auth_to,auto_wildcard,function(res){ site.ssl.ssl_result(res,auth_type,web.name); }) } }); robj.append(_btn_data.html); bt.render_clicks(_btn_data.clicks); robj.append(bt.render_help(helps[0])); robj.find('input[type="radio"]:eq(0)').trigger('click') }) } }, { title: "其他证书", callback: function (robj) { var cert_info = ''; if (rdata.cert_data['notBefore']) { cert_info = '
    \

    '+ (rdata.status ? '已部署成功:请在证书到期之前更换新的证书' :'当前未部署:请点击【保存】按钮完成此证书的部署')+'\ \ 证书品牌:'+ rdata.cert_data.issuer + '

    \ 认证域名: ' + rdata.cert_data.dns.join('、') + '\ 到期时间: ' + rdata.cert_data.notAfter + '
    ' } robj.append('
    ' + cert_info+'
    密钥(KEY)证书(PEM格式)
    '); var datas = [ { items: [ { name: 'key', width: '45%', height: '220px', type: 'textarea', value: rdata.key }, { name: 'csr', width: '45%', height: '220px', type: 'textarea', value: rdata.csr } ] }, { items: [ { text: '保存', name: 'btn_ssl_save', type: 'button', callback: function (sdata) { bt.site.set_ssl(web.name, sdata, function (ret) { if (ret.status) site.reload(7); bt.msg(ret); }) } }, { text: '关闭SSL', name: 'btn_ssl_close', hide: !rdata.status, type: 'button', callback: function (sdata) { site.ssl.set_ssl_status('CloseSSLConf', web.name); } } ] } ] for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } var helps = [ '粘贴您的*.key以及*.pem内容,然后保存即可[帮助]。', '如果浏览器提示证书链不完整,请检查是否正确拼接PEM证书', 'PEM格式证书 = 域名证书.crt + 根证书(root_bundle).crt', '在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点', ] robj.append(bt.render_help(helps)); } }, { title: "关闭", callback: function (robj) { if (rdata.type == -1) { robj.html("
    " + lan.site.ssl_help_1 + "
    "); return; }; var txt = ''; switch (rdata.type) { case 1: txt = "Let's Encrypt"; break; case 0: txt = '其他证书'; break; case 2: txt = lan.site.bt_ssl; break; } $(".tab-con").html("
    " + lan.get('ssl_enable', [txt]) + "
    "); } }, { title: "证书夹", callback: function (robj) { robj.html("
    "); bt.site.get_cer_list(function (rdata) { bt.render({ table: '#cer_list_table', columns: [ { field: 'subject', title: '域名', templet: function (item) { return item.dns.join('
    ') } }, { field: 'notAfter', width: '83px', title: '到期时间' }, { field: 'issuer', width: '150px', title: '品牌' }, { field: 'opt', width: '75px', align: 'right', title: '操作', templet: function (item) { var opt = '部署 | '; opt += '删除' return opt; } } ], data: rdata }) }) } } ] bt.render_tab('ssl_tabs', _tabs); $('#ssl_tabs').append('
    强制HTTPS
    '); $("#toHttps").attr('checked', rdata.httpTohttps); $('#toHttps').click(function (sdata) { var isHttps = $("#toHttps").attr('checked'); if (isHttps) { layer.confirm('关闭强制HTTPS后需要清空浏览器缓存才能看到效果,继续吗?', { icon: 3, title: "关闭强制HTTPS" }, function () { bt.site.close_http_to_https(web.name, function (rdata) { if (rdata.status) { setTimeout(function () { site.reload(7); }, 3000); } }) }); } else { bt.site.set_http_to_https(web.name, function (rdata) { if (!rdata.status) { setTimeout(function () { site.reload(7); }, 3000); } }) } }) switch (rdata.type) { case 1: $('#ssl_tabs span:eq(1)').trigger('click'); break; case 0: $('#ssl_tabs span:eq(2)').trigger('click'); break; default: $('#ssl_tabs span:eq(0)').trigger('click'); break; } }) }, set_php_version: function (web) { bt.site.get_site_phpversion(web.name, function (sdata) { if (sdata.status === false) { bt.msg(sdata); return; } bt.site.get_all_phpversion(function (vdata) { var versions = []; for (var j = vdata.length - 1; j >= 0; j--) { var o = vdata[j]; o.value = o.version; o.title = o.name; versions.push(o); } var data = { items: [ { title: 'PHP版本', name: 'versions', value: sdata.phpversion, type: 'select', items: versions }, { text: '切换', name: 'btn_change_phpversion', type: 'button', callback: function (pdata) { bt.site.set_phpversion(web.name, pdata.versions, function (ret) { if (ret.status) site.reload(8) bt.msg(ret); }) } } ] } var _form_data = bt.render_form_line(data); var _html = $(_form_data.html); _html.append(bt.render_help(['请根据您的程序需求选择版本', '若非必要,请尽量不要使用PHP5.2,这会降低您的服务器安全性;', 'PHP7不支持mysql扩展,默认安装mysqli以及mysql-pdo。'])); $('#webedit-con').append(_html); bt.render_clicks(_form_data.clicks); $('#webedit-con').append('
    session隔离
    ' + bt.render_help(['开启后将会把session文件存放到独立文件夹独立文件夹,不与其他站点公用存储位置','若您在PHP配置中将session保存到memcache/redis等缓存器时,请不要开启此选项'])); function get_session_status(){ var loading = bt.load('正在获取session状态请稍后'); bt.send('get_php_session_path','config/get_php_session_path',{id:web.id},function(tdata){ loading.close(); $('#session_switch').prop("checked",tdata); }) }; get_session_status() $('#session_switch').click(function() { var val = $(this).prop('checked'); bt.send('set_php_session_path','config/set_php_session_path',{id:web.id,act:val? 1:0},function(rdata){ bt.msg(rdata) }) setTimeout(function () { get_session_status(); }, 500) }) }) }) }, templet_301: function (sitename, id, types, obj) { if (types) { obj = { redirectname:(new Date()).valueOf(), tourl: 'http://', redirectdomain: [], redirectpath: '', redirecttype: '', type: 1, domainorpath: 'domain', holdpath: 1 } } var helps = [ '重定向类型:表示访问选择的“域名”或输入的“路径”时将会重定向到指定URL', '目标URL:可以填写你需要重定向到的站点,目标URL必须为可正常访问的URL,否则将返回错误', '重定向方式:使用301表示永久重定向,使用302表示临时重定向', '保留URI参数:表示重定向后访问的URL是否带有子路径或参数如设置访问http://b.com 重定向到http://a.com', '保留URI参数: http://b.com/1.html ---> http://a.com/1.html', '不保留URI参数:http://b.com/1.html ---> http://a.com' ]; bt.site.get_domains(id, function (rdata) { var domain_html = '' for (var i = 0; i < rdata.length; i++) { domain_html += ''; } var form_redirect = bt.open({ type: 1, skin: 'demo-class', area: '650px', title: types ? '创建重定向' : '修改重定向[' + obj.redirectname + ']', closeBtn: 2, shift: 5, shadeClose: false, content: "
    " + "
    " + "开启重定向" + "
    " + "" + "
    " + "保留URI参数" + "" + "
    " + "
    " + "
    " + "" + "
    " + "重定向类型" + "
    " + "" + "重定向方式" + "
    " + "
    " + "
    " + "重定向域名" + "
    " + "" + "目标URL" + "" + "
    " + "
    " + "
    " + "重定向路径" + "
    " + "" + "目标URL" + "" + "
    " + "
    " + "
      " + bt.render_help(helps) + '
    ' + "
    " + "
    " }); setTimeout(function () { $('.selectpicker').selectpicker({ 'noneSelectedText': '请选择域名...', 'selectAllText': '全选', 'deselectAllText': '取消全选' }); $('.selectpicker').selectpicker('val', obj.redirectdomain); $('#form_redirect').parent().css('overflow', 'inherit'); $('[name="domainorpath"]').change(function () { if ($(this).val() == 'path') { $('.redirectpath').show(); $('.redirectdomain').hide(); $('.selectpicker').selectpicker('val', []); } else { $('.redirectpath').hide(); $('.redirectdomain').show(); $('[name="redirectpath"]').val('') } }); $('.btn-colse-prosy').click(function () { form_redirect.close(); }); $('.btn-submit-redirect').click(function () { var type = $('[name="type"]').prop('checked') ? 1 : 0; var holdpath = $('[name="holdpath"]').prop('checked') ? 1 : 0; var redirectname = $('[name="redirectname"]').val(); var redirecttype = $('[name="redirecttype"]').val(); var domainorpath = $('[name="domainorpath"]').val(); var redirectpath = $('[name="redirectpath"]').val(); var redirectdomain = JSON.stringify($('.selectpicker').val() || []); var tourl = $(domainorpath == 'path' ? '[name="tourl1"]' : '[name="tourl"]').val(); if (!types) { bt.site.modify_redirect({ type: type, sitename: sitename, holdpath: holdpath, redirectname: redirectname, redirecttype: redirecttype, domainorpath: domainorpath, redirectpath: redirectpath, redirectdomain: redirectdomain, tourl: tourl }, function (rdata) { if (rdata.status) { form_redirect.close(); site.reload(11); } bt.msg(rdata); }); } else { bt.site.create_redirect({ type: type, sitename: sitename, holdpath: holdpath, redirectname: redirectname, redirecttype: redirecttype, domainorpath: domainorpath, redirectpath: redirectpath, redirectdomain: redirectdomain, tourl: tourl }, function (rdata) { if (rdata.status) { form_redirect.close(); site.reload(11); } bt.msg(rdata); }); } }); }, 100); }); }, template_Dir: function(id,type,obj){ if(type){ obj = {"name":"","sitedir": "", "username":"","password":""}; }else{ obj = {"name":obj.name,"sitedir": obj.site_dir, "username":"","password":""}; } var form_directory = bt.open({ type: 1, skin: 'demo-class', area: '550px', title: type ? '添加目录保护' : '修改目录目录', closeBtn: 2, shift: 5, shadeClose: false, content: "
    " + "
    " + "名称" + "
    " + "
    " + "
    " + "保护的目录" + "
    " + "
    " + "
    " + "用户名" + "
    " + "
    " + "
    " + "密码" + "
    " + "
    "+ "
      "+ "
    • 目录设置保护后,访问时需要输入账号密码才能访问
    • "+ "
    • 例如我设置了保护目录 /test/ ,那我访问 http://aaa.com/test/ 是就要输入账号密码才能访问
    • "+ "
    "+ "
    " }); $('.btn-colse-guard').click(function () { form_directory.close(); }); $('.btn-submit-guard').click(function() { var guardData = {}; guardData['id'] = id; guardData['name'] = $('input[name="dir_name"]').val(); guardData['site_dir'] = $('input[name="dir_sitedir"]').val(); guardData['username'] = $('input[name="dir_username"]').val(); guardData['password'] = $('input[name="dir_password"]').val(); if(type){ bt.site.create_dir_guard(guardData, function (rdata) { if (rdata.status) { form_directory.close(); site.reload() } bt.msg(rdata); }); }else{ bt.site.edit_dir_account(guardData, function (rdata) { if (rdata.status) { form_directory.close(); site.reload() } bt.msg(rdata); }); } }); setTimeout(function(){ if(!type){ $('input[name="dir_name"]').attr('disabled', 'disabled'); $('input[name="dir_sitedir"]').attr('disabled', 'disabled'); } },500) }, set_301_old:function(web){ bt.site.get_domains(web.id,function(rdata){ var domains = [{title:'整站',value:'all'}]; for(var i=0;i'); setTimeout(function () { var _tab = bt.render({ table: '#proxy_list', columns: [ // { field: 'redirectname', title: '名称' }, { field: '', title: '重定向类型', templet: function (item) { var conter = ''; if (item.domainorpath == 'path') { conter = item.redirectpath; } else { conter = item.redirectdomain ? item.redirectdomain.join('、') : '空' } return '' + conter + ''; } }, { field: 'redirecttype', title: '重定向方式' }, { field: 'holdpath', index: true, title: '保留URI参数', templet: function (item) { return '' + (item.holdpath == 1 ? '开启' : '关闭') + ''; } }, { field: 'type', title: '状态', index: true, templet: function (item) { return '' + (item.type == 1 ? '运行中' : '已暂停') + '' } }, { field: '', title: '操作', align: 'right', index: true, templet: function (item) { var redirectname = item.redirectname; var sitename = item.sitename; var conter = '配置文件 ' + '| 编辑 ' + '| 删除'; return conter } } ], data: rdata }); $('.edit_redirect').click(function () { var index = parseInt($(this).parent().attr('data-index')); site.edit.templet_301(web.name, web.id, false, rdata[index]); }); $('.open_config_file').click(function () { var index = $(this).parent().attr('data-index'); var sitename = web.name; var redirectname = rdata[index].redirectname; var redirect_config = ''; bt.site.get_redirect_config({ sitename: sitename, redirectname: redirectname, webserver: bt.get_cookie('serverType') }, function (rdata) { if (typeof rdata == 'object' && rdata.constructor == Array) { if (!rdata[0].status) bt.msg(rdata) } else { if (!rdata.status) bt.msg(rdata) } var datas = [ { items: [{ name: 'redirect_configs', type: 'textarea', value: rdata[0].data, widht: '340px', height: '200px' }] }, { name: 'btn_config_submit', text: '保存', type: 'button', callback: function (ddata) { bt.site.save_redirect_config({ path: rdata[1], data: editor.getValue(), encoding: rdata[0].encoding }, function (ret) { if (ret.status) { site.reload(11); redirect_config.close(); } bt.msg(ret); }) } } ] redirect_config = bt.open({ type: 1, area: ['550px', '550px'], title: '编辑配置文件[' + redirectname + ']', closeBtn: 2, shift: 0, content: "
    " }) var robj = $('#redirect_config_con'); for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } robj.append(bt.render_help(['此处为该负载均衡的配置文件,若您不了解配置规则,请勿随意修改。'])); $('textarea.redirect_configs').attr('id', 'configBody'); var editor = CodeMirror.fromTextArea(document.getElementById("configBody"), { extraKeys: { "Ctrl-Space": "autocomplete" }, lineNumbers: true, matchBrackets: true }); $(".CodeMirror-scroll").css({ "height": "350px", "margin": 0, "padding": 0 }); setTimeout(function () { editor.refresh(); }, 250); }); }); $('.set_path_state').click(function () { type_edit_redirect($(this), 'holdpath') }); $('.set_type_state').click(function () { type_edit_redirect($(this), 'type'); }); function type_edit_redirect(_this, type) { var index = _this.parent().attr('data-index'); var status = _this.attr('data-stuats'); var item = rdata[index]; item[type] = status; item['redirectdomain'] = JSON.stringify(item['redirectdomain']); // item['redirectdomain'] = JSON.stringify(['redirectdomain']); bt.site.modify_redirect(item, function (res) { if (res.status) site.reload(11); bt.msg(res); }); } }, 100); }); }, templet_proxy: function (sitename, type, obj) { if (type) { obj = { "type": 1, "cache": 0, "proxyname": "", "proxydir": "/", "proxysite": "http://", "cachetime": 1, "todomain": "$host", "subfilter": [{ "sub1": "", "sub2": "" }] }; } var sub_conter = ''; for (var i = 0; i < obj.subfilter.length; i++) { if (i == 0 || obj.subfilter[i]['sub1'] != '') { sub_conter += "
    " + "" + "" + "删除" + "
    "; } if (i == 2) $('.add-replace-prosy').attr('disabled', 'disabled') } var helps = [ '代理目录:访问这个目录时将会把目标URL的内容返回并显示(需要开启高级功能)', '目标URL:可以填写你需要代理的站点,目标URL必须为可正常访问的URL,否则将返回错误', '发送域名:将域名添加到请求头传递到代理服务器,默认为目标URL域名,若设置不当可能导致代理无法正常运行', '内容替换:只能在使用nginx时提供,最多可以添加3条替换内容,如果不需要替换请留空' ]; var form_proxy = bt.open({ type: 1, skin: 'demo-class', area: '650px', title: type ? '创建反向代理' : '修改反向代理[' + obj.proxyname + ']', closeBtn: 2, shift: 5, shadeClose: false, content: "
    " + "
    " + "开启代理" + "
    " + "" + "
    " + "开启缓存" + "" + "
    " + "
    " + "高级功能" + "" + "
    " + "
    " + "
    " + "
    " + "代理名称" + "
    " + "
    " + "
    " + "缓存时间" + "
    分钟
    " + "
    " + "
    " + "代理目录" + "
    " + "
    " + "
    " + "
    " + "目标URL" + "
    " + "" + "发送域名" + "
    " + "
    " + "
    " + "内容替换" + "
    " + sub_conter + "
    " + "
    " + "
    " + "
    " + "" + "
    " + "
    " + "
      " + bt.render_help(helps) + "
      " + "" }); bt.set_cookie('form_proxy', form_proxy); $('.add-replace-prosy').click(function () { var length = $(".replace_conter .sub-groud").length; if (length == 2) $(this).attr('disabled', 'disabled') var conter = "
      " + "" + "" + "删除" + "
      " $(".replace_conter .info-r").append(conter); }); $('[name="proxysite"]').keyup(function () { var val = $(this).val(),ip_reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/; val = val.replace(/^http[s]?:\/\//, ''); val = val.replace(/:([0-9]*)$/,''); if(ip_reg.test(val)){ $("[name='todomain']").val('$host'); }else{ $("[name='todomain']").val(val); } }); $('#openAdvanced').click(function () { if ($(this).prop('checked')) { $('.advanced').show(); } else { $('.advanced').hide(); } }); $('#openNginx').click(function () { if ($(this).prop('checked')) { $('.cachetime').show(); } else { $('.cachetime').hide(); } }); $('.btn-colse-prosy').click(function () { form_proxy.close(); }); $('.replace_conter').on('click', '.proxy_del_sub', function () { $(this).parent().remove(); $('.add-replace-prosy').removeAttr('disabled') }); $(".btn-submit-prosy").click(function () { var form_proxy_data = {}; $.each($('#form_proxy').serializeArray(), function () { if (form_proxy_data[this.name]) { if (!form_proxy_data[this.name].push) { form_proxy_data[this.name] = [form_proxy_data[this.name]]; } form_proxy_data[this.name].push(this.value || ''); } else { form_proxy_data[this.name] = this.value || ''; } }); form_proxy_data['type'] = (form_proxy_data['type'] == undefined ? 0 : 1); form_proxy_data['cache'] = (form_proxy_data['cache'] == undefined ? 0 : 1); form_proxy_data['advanced'] = (form_proxy_data['advanced'] == undefined ? 0 : 1); form_proxy_data['sitename'] = sitename; form_proxy_data['subfilter'] = JSON.stringify([ { 'sub1': form_proxy_data['rep1'] || '', 'sub2': form_proxy_data['rep2'] || '' }, { 'sub1': form_proxy_data['rep3'] || '', 'sub2': form_proxy_data['rep4'] || '' }, { 'sub1': form_proxy_data['rep5'] || '', 'sub2': form_proxy_data['rep6'] || '' }, ]); for (var i in form_proxy_data) { if (i.indexOf('rep') != -1) { delete form_proxy_data[i]; } } if (type) { bt.site.create_proxy(form_proxy_data, function (rdata) { if (rdata.status) { form_proxy.close(); site.reload(12); } bt.msg(rdata); }); } else { bt.site.modify_proxy(form_proxy_data, function (rdata) { if (rdata.status) { form_proxy.close(); site.reload(12); } bt.msg(rdata); }); } }); }, set_proxy: function (web) { String.prototype.myReplace = function (f, e) {//吧f替换成e var reg = new RegExp(f, "g"); //创建正则RegExp对象 return this.replace(reg, e); } bt.site.get_proxy_list(web.name, function (rdata) { var datas = { items: [{ name: 'add_proxy', text: '添加反向代理', type: 'button', callback: function (data) { site.edit.templet_proxy(web.name, true) } }] } var form_line = bt.render_form_line(datas); $('#webedit-con').append(form_line.html); bt.render_clicks(form_line.clicks); $('#webedit-con').addClass('divtable').append('
      '); setTimeout(function () { var _tab = bt.render({ table: '#proxy_list', columns: [ { field: 'proxyname', title: '名称', templet: function (item) { return '' + item.proxyname + '' } }, { field: 'proxydir', title: '代理目录', templet: function (item) { return '' + item.proxydir + '' } }, { field: 'proxysite', title: '目标url', templet: function (item) { return '' + item.proxysite + '' } }, bt.get_cookie('serverType') == 'nginx' ? { field: 'cache', title: '缓存', index: true, templet: function (item, index) { return '' + (item.cache == 1 ? '已开启' : '已关闭') + '' } } : '', { field: 'type', title: '状态', index: true, templet: function (item) { return '' + (item.type == 1 ? '运行中' : '已暂停') + '' } }, { field: 'dname', title: '操作', align: 'right', templet: function (item) { var proxyname = item.proxyname; var sitename = item.sitename; item = JSON.stringify(item).myReplace('"', '\''); var conter = '配置文件 ' + '| 编辑 ' + '| 删除'; return conter } } ], data: rdata }); $('.open_config_file').click(function () { var sitename = $(this).attr('data-name'); var proxyname = $(this).attr('data-proxyname'); var proxy_config = ''; bt.site.get_proxy_config({ sitename: sitename, proxyname: proxyname, webserver: bt.get_cookie('serverType') }, function (rdata) { if (typeof rdata == 'object' && rdata.constructor == Array) { if (!rdata[0].status) bt.msg(rdata) } else { if (!rdata.status) bt.msg(rdata) } var datas = [ { items: [{ name: 'proxy_configs', type: 'textarea', value: rdata[0].data, widht: '340px', height: '200px' }] }, { name: 'btn_config_submit', text: '保存', type: 'button', callback: function (ddata) { bt.site.save_proxy_config({ path: rdata[1], data: editor.getValue(), encoding: rdata[0].encoding }, function (ret) { if (ret.status) { site.reload(12); proxy_config.close(); } bt.msg(ret); }) } } ] proxy_config = bt.open({ type: 1, area: ['550px', '550px'], title: '编辑配置文件[' + proxyname + ']', closeBtn: 2, shift: 0, content: "
      " }) var robj = $('#proxy_config_con'); for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } robj.append(bt.render_help(['此处为该负载均衡的配置文件,若您不了解配置规则,请勿随意修改。'])); $('textarea.proxy_configs').attr('id', 'configBody'); var editor = CodeMirror.fromTextArea(document.getElementById("configBody"), { extraKeys: { "Ctrl-Space": "autocomplete" }, lineNumbers: true, matchBrackets: true }); $(".CodeMirror-scroll").css({ "height": "350px", "margin": 0, "padding": 0 }); setTimeout(function () { editor.refresh(); }, 250); }); }); $('.set_nginx_state').click(function () { type_edit_proxy($(this), 'cache') }); $('.set_type_state').click(function () { type_edit_proxy($(this), 'type'); }); function type_edit_proxy(_this, type) { var index = _this.parent().attr('data-index'); var status = _this.attr('data-stuats'); var item = rdata[index]; item[type] = status; item['subfilter'] = JSON.stringify(item['subfilter']); bt.site.modify_proxy(item, function (rdata) { if (rdata.status) site.reload(12); bt.msg(rdata); }); } }, 100); }); }, set_security: function (web) { bt.site.get_site_security(web.id, web.name, function (rdata) { var robj = $('#webedit-con'); var datas = [ { title: 'URL后缀', name: 'sec_fix', value: rdata.fix, disabled: rdata.status, width: '360px' }, { title: '许可域名', name: 'sec_domains', value: rdata.domains, disabled: rdata.status, width: '360px' }, { title: ' ', class: 'label-input-group', items: [ { text: '启用防盗链', name: 'status', value: rdata.status, type: 'checkbox', callback: function (sdata) { bt.site.set_site_security(web.id, web.name, sdata.sec_fix, sdata.sec_domains, sdata.status, function (ret) { if (ret.status) site.reload(13) bt.msg(ret); }) } }, { text: '允许空HTTP_REFERER请求', name: 'none', value: rdata.none, type: 'checkbox', callback: function (sdata) { bt.site.set_site_security(web.id, web.name, sdata.sec_fix, sdata.sec_domains, '1', function (ret) { if (ret.status) site.reload(13) bt.msg(ret); }) } } ] } ] for (var i = 0; i < datas.length; i++) { var _form_data = bt.render_form_line(datas[i]); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); } var helps = ['默认允许资源被直接访问,即不限制HTTP_REFERER为空的请求', '多个URL后缀与域名请使用逗号(,)隔开,如: png,jpeg,zip,js', '当触发防盗链时,将直接返回404状态'] robj.append(bt.render_help(helps)); }) }, set_tomact: function (web) { bt.site.get_site_phpversion(web.name, function (rdata) { var robj = $('#webedit-con'); if (!rdata.tomcatversion) { robj.html('' + lan.site.tomcat_err_msg1 + ''); layer.msg(lan.site.tomcat_err_msg, { icon: 2 }); return; } var data = { class: 'label-input-group', items: [{ text: lan.site.enable_tomcat, name: 'tomcat', value: rdata.tomcat == -1 ? false : true, type: 'checkbox', callback: function (sdata) { bt.site.set_tomcat(web.name, function (ret) { if (ret.status) site.reload(9) bt.msg(ret); }) } }] } var _form_data = bt.render_form_line(data); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); var helps = [lan.site.tomcat_help1 + ' ' + rdata.tomcatversion + ',' + lan.site.tomcat_help2, lan.site.tomcat_help3, lan.site.tomcat_help4, lan.site.tomcat_help5] robj.append(bt.render_help(helps)); }) }, get_site_logs: function (web) { bt.site.get_site_logs(web.name, function (rdata) { var robj = $('#webedit-con'); var logs = { class: 'bt-logs', items: [{ name: 'site_logs', height: '600px', value: rdata.msg, width: '100%', type: 'textarea' }] }; var _form_data = bt.render_form_line(logs); robj.append(_form_data.html); bt.render_clicks(_form_data.clicks); $('textarea[name="site_logs"]').attr('readonly', true); }) } }, create_let: function (ddata, callback) { bt.site.create_let(ddata, function (ret) { if (ret.status) { if (callback) { callback(ret); } else { site.ssl.reload(1); bt.msg(ret); return; } } else { if (ret.msg) { if (typeof (ret.msg) == 'string') { ret.msg = [ret.msg, ""]; } } if (!ret.out) { if (callback) { callback(ret); return; } bt.msg(ret); return; } var data = "

      " + ret.msg + "


      " if (ret.err[0].length > 10) data += '

      ' + ret.err[0].replace(/\n/g, '
      ') + '

      '; if (ret.err[1].length > 10) data += '

      ' + ret.err[1].replace(/\n/g, '
      ') + '

      '; layer.msg(data, { icon: 2, area: '500px', time: 0, shade: 0.3, shadeClose: true }); } }) }, reload: function (index) { if (index == undefined) index = 0 var _sel = $('.site-menu p.bgw'); if (_sel.length == 0) _sel = $('.site-menu p:eq(0)'); _sel.trigger('click'); }, plugin_firewall: function () { var typename = bt.get_cookie('serverType'); var name = 'btwaf_httpd'; if (typename == "nginx") name = 'btwaf' bt.plugin.get_plugin_byhtml(name, function (rhtml) { if (rhtml.status === false) return; var list = rhtml.split('