$("#site_search_input").keyup(function(event){ if(event.keyCode == 13) { getWeb(1, -1, $(this).val()); } }); $('#site_search').click(function(){ getWeb(1, -1, $('#site_search_input').val()); }); //设置到期日期 function getDate(a) { var dd = new Date(); dd.setTime(dd.getTime() + (a == undefined || isNaN(parseInt(a)) ? 0 : parseInt(a)) * 86400000); var y = dd.getFullYear(); var m = dd.getMonth() + 1; var d = dd.getDate(); return y + "-" + (m < 10 ? ('0' + m) : m) + "-" + (d < 10 ? ('0' + d) : d); } /** * 取回网站数据列表 * @param {Number} page 当前页 * @param {String} search 搜索条件 */ function getWeb(page, type_id, search) { if ( typeof(search) == 'undefined' ){ search = $('#site_search_input').val(); } var page = page == undefined ? '1':page; var order = getCookie('order'); if(order){ order = '&order=' + order; } else { order = ''; } var type = ''; if ( typeof(type_id) == 'undefined' ){ type = '&type_id=-1'; } else { type = '&type_id='+type_id; } var pdata = 'limit=10&p=' + page + '&search=' + search + order + type; var loadT = layer.load(); //取回数据 $.post('/site/list', pdata, function(data) { layer.close(loadT); //构造数据列表 var body = ''; $("#webBody").html(body); var list = data.data; for (var i = 0; i < list.length; i++) { //当前站点状态 if (list[i].status == '正在运行' || list[i].status == '1') { var status = "运行中"; } else { var status = "已停止"; } //是否有备份 if (list[i].backup_count > 0) { var backup = "有备份"; } else { var backup = "无备份"; } //是否设置有效期 var web_end_time = (list[i].edate == "0000-00-00") ? '永久': list[i].edate; //表格主体 var shortwebname = list[i].name; var shortpath = list[i].path; if(list[i].name.length > 30) { shortwebname = list[i].name.substring(0, 30) + "..."; } if(list[i].path.length > 30){ shortpath = list[i].path.substring(0, 30) + "..."; } var idname = list[i].name.replace(/\./g,'_'); body = "\ " + shortwebname + "\ " + status + "\ " + backup + "\ " + shortpath + "\ " + web_end_time + "\ " + list[i].ps + "\ \ 设置\ | 删除\ " $("#webBody").append(body); $('#webBody').on('click','#site_'+ list[i].id,function(){ var _this = $(this); var id = $(this).attr('data-ids'); laydate.render({ elem: '#site_'+ id, min:getDate(-1), max:'9999-12-31', vlue:getDate(365), type:'date', format :'yyyy-MM-dd', trigger:'click', btns:['perpetual', 'confirm'], theme:'#20a53a', done:function(dates){ if(_this.html() == '永久'){ dates = '0000-00-00'; } var loadT = layer.msg('正在保存...', { icon: 16, time: 0, shade: [0.3, "#000"]}); $.post('/site/set_end_date','id='+id+'&edate='+dates,function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:5}); },'json'); } }); this.click(); }); } if(body.length < 10){ body = "当前没有站点数据"; $("#webBody").html(body); } //输出数据列表 $(".btn-more").hover(function(){ $(this).addClass("open"); },function(){ $(this).removeClass("open"); }); //输出分页 $("#webPage").html(data.page); $(".btlinkbed").click(function(){ var dataid = $(this).attr("data-id"); var databak = $(this).text(); if(databak == null){ databak = ''; } $(this).hide().after(""); $(".baktext").focus(); }); readerTableChecked(); },'json'); } function getBakPost(b) { $(".baktext").hide().prev().show(); var id = $(".baktext").attr("data-id"); var page = $(".baktext").attr("data-page"); var a = $(".baktext").val(); if(a == "") { a = '空'; } setWebPs(b, id, a,page); $("a[data-id='" + id + "']").html(a); $(".baktext").remove(); } function setWebPs(b, id, ps,page) { var d = layer.load({shade: true,shadeClose: false}); var ps = 'ps=' + ps; $.post('/site/set_ps', 'id=' + id + "&" + ps, function(data) { if(data['status']) { getWeb(page); layer.closeAll(); layer.msg('修改成功!', {icon: 1}); } else { layer.closeAll(); layer.msg('修改失败!', {icon: 2}); } },'json'); } //创建站点前,检查服务是否开启 function webAdd(type){ loading = layer.msg('正在检查是否开启OpenResty服务!',{icon:16,time:0,shade: [0.3, "#000"]}) $.post('/site/check_web_status', function(data){ layer.close(loading); if (data.status){ webAddPage(type) } else { layer.msg(data.msg,{icon:0,time:3000,shade: [0.3, "#000"]}) } },'json'); } //添加站点 function webAddPage(type) { if (type == 1) { var array; var str=""; var domainlist=''; var domain = array = $("#mainDomain").val().replace('http://','').replace('https://','').split("\n"); var webport=[]; var checkDomain = domain[0].split('.'); if(checkDomain.length < 1){ layer.msg(lan.site.domain_err_txt,{icon:2}); return; } for(var i=1; i"; layer.open({ type: 1, skin: 'demo-class', area: '640px', title: '添加网站', closeBtn: 1, shift: 0, shadeClose: false, content: "
\
\ "+lan.site.domain+"\
\ \
\
\
\ 备注\
\ \
\
\
\ 根目录\
\ \ \
\
\ "+php_version+"\
\ \ \
\
", }); $(function() { var placeholder = "
"+lan.site.domain_help+"
"; $('#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(); } }); //验证PHP版本 $("select[name='version']").change(function(){ if($(this).val() == '52'){ var msgerr = 'PHP5.2在您的站点有漏洞时有跨站风险,请尽量使用PHP5.3以上版本!'; $('#php_w').text(msgerr); }else{ $('#php_w').text(''); } }) $('#mainDomain').on('input', function() { var array; var res,ress; var str = $(this).val().replace('http://','').replace('https://',''); 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); } var placeholder = $("#inputPath").attr('placeholder'); $("#inputPath").val(placeholder+'/'+ress); if(res.length > 15){ res = res.substr(0,15); } $("#Wbeizhu").val(ress); }) //备注 $('#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); }); }, 'json'); } //修改网站目录 function webPathEdit(id){ $.post('/site/get_dir_user_ini','id='+id, function(data){ var data = data['data']; var site_path = data['path']; var site_name = data['name']; var run_path = data['run_path']['run_path']; var user_ini_checked = data.user_ini?'checked':''; var logs_checked = data.logs?'checked':''; var opt = ''; var selected = ''; for(var i=0;i'+ data.run_path.dirs[i] +''; } var content = "
\
\ \ \
\
\ 网站目录\ \ \ \
\
\ 运行目录\ \ \
\
    \
  • 部分程序需要指定二级目录作为运行目录,如ThinkPHP5,Laravel
  • \
  • 选择您的运行目录,点保存即可
  • \
" +'
' +'密码访问' +'' +'' +'' +'
' +'
' +'

授权账号

' +'

访问密码

' +'

重复密码

' +'

' +'
' +'
'; $("#webedit-con").html(content); $("#userini").change(function(){ $.post('/site/set_dir_user_ini',{'path':site_path,'run_path':run_path,},function(userini){ layer.msg(data.msg+'

注意:设置防跨站需要重启PHP才能生效!

',{icon:data.status?1:2}); tryRestartPHP(site_name); },'json'); }); $("#logs").change(function(){ var loadT = layer.msg("正在设置中...",{icon:16,time:10000,shade: [0.3, '#000']}); $.post('/site/logs_open','id='+id, function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); }); },'json'); } //是否设置访问密码 function pathSafe(id){ var isPass = $('#pathSafe').prop('checked'); if(!isPass){ $(".user_pw").show(); } else { var loadT = layer.msg(lan.public.the,{icon:16,time:10000,shade: [0.3, '#000']}); $.post('/site/close_has_pwd',{id:id},function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); $(".user_pw").hide(); },'json'); } } //设置访问密码 function setPathSafe(id){ var username = $("#username_get").val(); var pass1 = $("#password_get_1").val(); var pass2 = $("#password_get_2").val(); if(pass1 != pass2){ layer.msg('两次输入的密码不一致!',{icon:2}); return; } var loadT = layer.msg('正在处理,请稍候...',{icon:16,time:10000,shade: [0.3, '#000']}); $.post('/site/set_has_pwd',{id:id,username:username,password:pass1},function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); } //提交运行目录 function setSiteRunPath(id){ var NewPath = $("#runPath").val(); var loadT = layer.msg(lan.public.the,{icon:16,time:10000,shade: [0.3, '#000']}); $.post('/site/set_site_run_path','id='+id+'&run_path='+NewPath,function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); } //提交网站目录 function setSitePath(id){ var NewPath = $("#inputPath").val(); var loadT = layer.msg('正在处理,请稍候...',{icon:16,time:10000,shade: [0.3, '#000']}); $.post('/site/set_path','id='+id+'&path='+NewPath,function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); } //修改网站备注 function webBakEdit(id){ $.post("/data?action=getKey','table=sites&key=ps&id="+id,function(rdata){ var webBakHtml = "
\
\ \
\ \

\
\
"; $("#webedit-con").html(webBakHtml); }); } //设置默认文档 function setIndexEdit(id){ $.post('/site/get_index','id='+id,function(data){ var rdata = data['index']; rdata = rdata.replace(new RegExp(/(,)/g), "\n"); var setIndexHtml = "
\
\ \ \
\
    \
  • 默认文档,每行一个,优先级由上至下。
  • \
\
"; $("#webedit-con").html(setIndexHtml); },'json'); } /** * 停止一个站点 * @param {Int} wid 网站ID * @param {String} wname 网站名称 */ function webStop(wid, wname) { layer.confirm('站点停用后将无法访问,您真的要停用这个站点吗?', {icon:3,closeBtn:2},function(index) { if (index > 0) { var loadT = layer.load(); $.post("/site/stop","id=" + wid + "&name=" + wname, function(ret) { layer.msg(ret.msg,{icon:ret.status?1:2}) layer.close(loadT); getWeb(1); },'json'); } }); } /** * 启动一个网站 * @param {Number} wid 网站ID * @param {String} wname 网站名称 */ function webStart(wid, wname) { layer.confirm('即将启动站点,您真的要启用这个站点吗?',{icon:3,closeBtn:2}, function(index) { if (index > 0) { var loadT = layer.load() $.post("/site/start","id=" + wid + "&name=" + wname, function(ret) { layer.msg(ret.msg,{icon:ret.status?1:2}) layer.close(loadT); getWeb(1); },'json'); } }); } /** * 删除一个网站 * @param {Number} wid 网站ID * @param {String} wname 网站名称 */ function webDelete(wid, wname){ var thtml = "
\ \
"; var info = '是否要删除同名根目录'; safeMessage('删除站点'+"["+wname+"]",info, function(){ var path=''; if($("#delpath").is(":checked")){ path='&path=1'; } var loadT = layer.msg('正在处理,请稍候...',{icon:16,time:10000,shade: [0.3, '#000']}); $.post("/site/delete","id=" + wid + "&webname=" + wname + path, function(ret){ layer.closeAll(); layer.msg(ret.msg,{icon:ret.status?1:2}) getWeb(1); },'json'); },thtml); } //批量删除 function allDeleteSite(){ var checkList = $("input[name=id]"); var dataList = new Array(); for(var i=0;i"+lan.site.all_del_info+"\
"; safeMessage(lan.site.all_del_site,""+lan.get('del_all_site',[dataList.length])+"",function(){ layer.closeAll(); var path = ''; if($("#delpath").is(":checked")){ path='&path=1'; } syncDeleteSite(dataList, 0,'',path); },thtml); } //模拟同步开始批量删除 function syncDeleteSite(dataList,successCount,errorMsg,path){ if(dataList.length < 1) { showMsg(lan.get('del_all_site_ok',[successCount]), function(){ // location.reload(); },{icon:1}); return; } var loadT = layer.msg(lan.get('del_all_task_the',[dataList[0].name]),{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/delete', 'id='+dataList[0].id+'&webname='+dataList[0].name+path , function(rdata){ layer.close(loadT); if(rdata.status){ successCount++; $("input[title='"+dataList[0].name+"']").parents("tr").remove(); } else { if(!errorMsg){ errorMsg = '

'+lan.site.del_err+':

'; } errorMsg += '
  • '+dataList[0].name+' -> '+rdata.msg+'
  • ' } dataList.splice(0,1); syncDeleteSite(dataList,successCount,errorMsg,path); },'json'); } /** * 域名管理 * @param {Int} id 网站ID */ function domainEdit(id, name, msg, status) { $.post('/site/get_domain' ,{pid:id}, function(data) { var domain = data.data; var echoHtml = ""; for (var i = 0; i < domain.length; i++) { echoHtml += "\ " + domain[i].name + "\ " + domain[i].port + "\ \ "; } var bodyHtml = "\ \ \
    \ \ \ " + echoHtml + "\
    "+lan.site.domain+"端口操作
    \
    "; $("#webedit-con").html(bodyHtml); if(msg != undefined){ layer.msg(msg,{icon:status?1:5}); } var placeholder = "
    每行填写一个域名,默认为80端口
    泛解析添加方法 *.domain.com
    如另加端口格式为 www.domain.com:88
    "; $('#newdomain').after(placeholder); $(".placeholder").click(function(){ $(this).hide(); $('#newdomain').focus(); }) $('#newdomain').focus(function() { $(".placeholder").hide(); }); $('#newdomain').blur(function() { if($(this).val().length==0){ $(".placeholder").show(); } }); $("#newdomain").on("input",function(){ var str = $(this).val(); if(isChineseChar(str)) { $('.btn-zhm').show(); } else{ $('.btn-zhm').hide(); } }) //checkDomain(); },'json'); } //编辑域名/端口 function cancelSend(){ $(".changeDomain,.changePort").hide().prev().show(); $(".changeDomain,.changePort").remove(); } //遍历域名 function checkDomain() { $("#checkDomain tr").each(function() { var $this = $(this); var domain = $(this).find("td:first-child").text(); $(this).find("td:first-child").append(""); }); } /** * 添加域名 * @param {Int} id 网站ID * @param {String} webname 主域名 */ function domainAdd(id, webname, type) { var Domain = $("#newdomain").val().split("\n"); var domainlist = ''; for(var i=0; i下载 | "; body += ""+frdata.data[i].name+"\ " + (toSize(frdata.data[i].size)) + "\ " + frdata.data[i].add_time + "\ "+ ftpdown + "删除\ " } var ftpdown = ''; frdata.page = frdata.page.replace(/'/g,'"').replace(/getBackup\(/g,"getBackup(" + id + ",0,"); if(name == 0){ var sBody = "\ \ "+body+"\
    文件名称文件大小打包时间操作
    " $("#webBackupList").html(sBody); $(".page").html(frdata.page); return; } layer.closeAll(); layer.open({ type: 1, skin: 'demo-class', area: '700px', title: '打包备份', closeBtn: 1, shift: 0, shadeClose: false, content: "
    \ \
    \ \ \ \ \ " + body + "\
    文件名称文件大小打包时间操作
    \
    " + frdata.page + "
    \
    \
    " }); },'json'); } function goSet(num) { //取选中对象 var el = document.getElementsByTagName('input'); var len = el.length; var data = ''; var a = ''; var count = 0; //构造POST数据 for (var i = 0; i < len; i++) { if (el[i].checked == true && el[i].value != 'on') { data += a + count + '=' + el[i].value; a = '&'; count++; } } //判断操作类别 if(num==1){ reAdd(data); } else if(num==2){ shift(data); } } //设置默认文档 function setIndex(id){ var quanju = (id==undefined)?lan.site.public_set:lan.site.local_site; var data=id==undefined?"":"id="+id; $.post('/site?action=GetIndex',data,function(rdata){ rdata= rdata.replace(new RegExp(/(,)/g), "\n"); layer.open({ type: 1, area: '500px', title: lan.site.setindex, closeBtn: 1, shift: 5, shadeClose: true, content:"
    " +"
    " +" "+lan.site.default_doc+"" +"
    " +" " +"

    "+quanju+lan.site.default_doc_help+"

    " +"
    " +"
    " +"
    " +" " +" " +"
    " +"
    " }); }); } //设置默认站点 function setDefaultSite(){ var name = $("#default_site").val(); var loadT = layer.msg('正在处理,请稍候...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_default_site','name='+name,function(rdata){ layer.closeAll(); layer.msg(rdata.msg,{icon:rdata.status?1:5}); },'json'); } //默认站点 function getDefaultSite(){ $.post('/site/get_default_site','',function(rdata){ var opt = ''; var selected = ''; for(var i=0;i' + rdata.sites[i].name + ''; } layer.open({ type: 1, area: '530px', title: '设置默认站点', closeBtn: 1, shift: 5, shadeClose: true, content:'
    \

    \ 默认站点\ \

    \
      \
    • 设置默认站点后,所有未绑定的域名和IP都被定向到默认站点
    • \
    • 可有效防止恶意解析
    • \
    \
    \ \ \
    \
    ' }); },'json'); } function setPHPVer(){ $.post('/site/get_cli_php_version','',function(rdata){ if(typeof(rdata['status'])!='undefined'){ layer.msg(rdata.msg,{icon:rdata.status?1:2}); return; } var opt = ''; var selected = ''; for(var i=0;i-1){ continue; } if (rdata.versions[i].version.indexOf("apt")>-1){ continue; } opt += ''; } var phpver_layer = layer.open({ type: 1, area: '530px', title: '设置PHP-CLI(命令行)版本', closeBtn: 1, shift: 5, shadeClose: true, btn:["确定","取消"], content:'
    \

    \ PHP-CLI版本\ \

    \
      \
    • 此处可设置命令行运行php时使用的PHP版本
    • \
    • 安装新的PHP版本后此处需要重新设置
    • \
    \
    ', yes:function(layero,index){ var version = $("#default_ver").val(); var loadT = layer.msg('正在处理,请稍候...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_cli_php_version','version='+version,function(rdata){ layer.close(loadT); showMsg(rdata.msg,function(){ if (rdata.status){ layer.close(phpver_layer); } },{icon:rdata.status?1:5},2000); },'json'); }, }); },'json'); } function setIndexList(id){ var Dindex = $("#Dindex").val().replace(new RegExp(/(\n)/g), ","); if(id == undefined ){ var data="id=&index="+Dindex; } else{ var data="id="+id+"&index="+Dindex; } var loadT= layer.load(2); $.post('/site/set_index',data,function(rdata){ layer.close(loadT); var ico = rdata.status? 1:5; layer.msg(rdata.msg,{icon:ico}); },'json'); } /* 站点修改 */ function webEdit(id,website,endTime,addtime){ // 暂时关闭 - 子目录绑定 //

    子目录绑定

    \ layer.open({ type: 1, area: ['700px','570px'], title: '站点修改['+website+'] -- 添加时间['+addtime+']', closeBtn: 1, shift: 0, content: "
    \
    \

    域名管理

    \

    网站目录

    \

    流量限制

    \

    伪静态

    \

    默认文档

    \

    配置文件

    \

    SSL

    \

    PHP版本

    \

    重定向

    \

    反向代理

    \

    防盗链

    \

    响应日志

    \

    错误日志

    \
    \
    \
    ", success:function(){ //域名输入提示 var placeholder = "
    每行填写一个域名,默认为80端口
    泛解析添加方法 *.domain.com
    如另加端口格式为 www.domain.com:88
    "; $('#newdomain').after(placeholder); $(".placeholder").click(function(){ $(this).hide(); $('#newdomain').focus(); }); $('#newdomain').focus(function() { $(".placeholder").hide(); }); $('#newdomain').blur(function() { if($(this).val().length == 0){ $(".placeholder").show(); } }); //切换 $(".bt-w-menu p").click(function(){ $(this).addClass("bgw").siblings().removeClass("bgw"); }); domainEdit(id,website); } }); } //取网站日志pluginLogs function getSiteLogs(siteName){ var loadT = layer.msg('正在处理,请稍候...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/get_logs',{siteName:siteName},function(logs){ layer.close(loadT); if(logs.status !== true){ logs.msg = ''; } if (logs.msg == '') logs.msg = '当前没有日志.'; var h = parseInt($('.bt-w-menu').css('height')) - 35; var con = ''; $("#webedit-con").html(con); var ob = document.getElementById('site_log'); ob.scrollTop = ob.scrollHeight; },'json'); } //取网站错误日志 function getSiteErrorLogs(siteName){ var loadT = layer.msg('正在处理,请稍候...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/get_error_logs',{siteName:siteName},function(logs){ layer.close(loadT); if(logs.status !== true){ logs.msg = ''; } if (logs.msg == '') logs.msg = '当前没有日志.'; var h = parseInt($('.bt-w-menu').css('height')) - 35; var con = ''; $("#webedit-con").html(con); var ob = document.getElementById('error_log'); ob.scrollTop = ob.scrollHeight; },'json'); } //防盗链 function security(id,name){ var loadT = layer.msg('正在提交任务...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/get_security',{id:id,name:name},function(rdata){ layer.close(loadT); var mbody = '
    ' +'

    URL后缀

    ' +'

    许可域名

    ' +'
    ' +'
    ' +'
      ' +'
    • 默认允许资源被直接访问,即不限制HTTP_REFERER为空的请求
    • ' +'
    • 多个URL后缀与域名请使用逗号(,)隔开,如: png,jpeg,zip,js
    • ' +'
    • 当触发防盗链时,将直接返回404状态
    • ' +'
    ' +'
    ' $("#webedit-con").html(mbody); },'json'); } //设置防盗链 function setSecurity(name,id, none){ setTimeout(function(){ var data = { fix:$("input[name='sec_fix']").val(), domains:$("input[name='sec_domains']").val(), status:$("input[name='sec_status']").prop("checked"), none:$("input[name='sec_none_status']").prop("checked"), name:name, id:id } var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_security',data,function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); if(rdata.status) setTimeout(function(){security(id,name);},1000); },'json'); },100); } //流量限制 function limitNet(id){ $.post('/site/get_limit_net','id='+id, function(rdata){ var status_selected = rdata.perserver != 0?'checked':''; if(rdata.perserver == 0){ rdata.perserver = 300; rdata.perip = 25; rdata.limit_rate = 512; } var limitList = "" +"" +"" +"" +"" +"" +"" var body = "
    " +'

    ' +"

    "+lan.site.limit_net_9+":

    " +"

    "+lan.site.limit_net_10+":

    " +"

    "+lan.site.limit_net_12+":

    " +"

    "+lan.site.limit_net_14+":

    " +"" +"
    " +"
    • "+lan.site.limit_net_11+"
    • "+lan.site.limit_net_13+"
    • "+lan.site.limit_net_15+"
    " $("#webedit-con").html(body); $("select[name='limit']").change(function(){ var type = $(this).val(); perserver = 300; perip = 25; limit_rate = 512; switch(type){ case '1': perserver = 300; perip = 25; limit_rate = 512; break; case '2': perserver = 200; perip = 10; limit_rate = 1024; break; case '3': perserver = 50; perip = 3; limit_rate = 2048; break; case '4': perserver = 500; perip = 10; limit_rate = 2048; break; case '5': perserver = 400; perip = 15; limit_rate = 1024; break; case '6': perserver = 60; perip = 10; limit_rate = 512; break; case '7': perserver = 150; perip = 4; limit_rate = 1024; break; } $("input[name='perserver']").val(perserver); $("input[name='perip']").val(perip); $("input[name='limit_rate']").val(limit_rate); }); },'json'); } //保存流量限制配置 function saveLimitNet(id, type){ var isChecked = $("input[name='status']").attr('checked'); if(isChecked == undefined || type == 1 ){ var data = 'id='+id+'&perserver='+$("input[name='perserver']").val()+'&perip='+$("input[name='perip']").val()+'&limit_rate='+$("input[name='limit_rate']").val(); var loadT = layer.msg(lan.public.config,{icon:16,time:10000}) $.post('/site/set_limit_net',data,function(rdata){ layer.close(loadT); limitNet(id); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); }else{ var loadT = layer.msg(lan.public.config,{icon:16,time:10000}) $.post('/site/close_limit_net',{id:id},function(rdata){ layer.close(loadT); limitNet(id); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); } } //子目录绑定 function dirBinding(id){ $.post('/site/get_dir_binding',{'id':id},function(data){ var rdata = data['data']; var echoHtml = ''; for(var i=0;i"+rdata.binding[i].port+""+rdata.binding[i].path+"伪静态 | 删除"; } var dirList = ''; for(var n=0;n"+rdata.dirs[n]+""; } var body = "
    " + "域名:" + "子目录:" + "" + "
    " + "
    " + "" + "" + echoHtml + "" + "
    域名端口子目录操作
    "; $("#webedit-con").html(body); },'json'); } //子目录伪静态 function setDirRewrite(id){ $.post('/site/get_dir_bind_rewrite','id='+id,function(rdata){ if(!rdata.status){ var confirmObj = layer.confirm('你真的要为这个子目录创建独立的伪静态规则吗?',{icon:3,closeBtn:2},function(){ $.post('/site/get_dir_bind_rewrite','id='+id+'&add=1',function(rdata){ layer.close(confirmObj); showRewrite(rdata); },'json'); }); return; } showRewrite(rdata); },'json'); } //显示伪静态 function showRewrite(rdata){ var rList = ''; for(var i=0;i"+rdata.rlist[i]+""; } var webBakHtml = "
    \
    \ \ \
    \ \
      \
    • 请选择您的应用,若设置伪静态后,网站无法正常访问,请尝试设置回default
    • \
    • 您可以对伪静态规则进行修改,修改完后保存即可。
    • \
    \
    "; layer.open({ type: 1, area: '500px', title: '配置伪静态规则', closeBtn: 1, shift: 5, shadeClose: true, content:webBakHtml, success:function(){ $("#myRewrite").change(function(){ var rewriteName = $(this).val(); $.post('/files/get_body','path='+rdata['rewrite_dir']+'/'+rewriteName+'.conf',function(fileBody){ $("#rewriteBody").val(fileBody.data.data); },'json'); }); $('#setRewriteBtn').click(function(){ var data = $("#rewriteBody").val(); setRewrite(rdata.filename, encodeURIComponent(data)); }); } }); } //添加子目录绑定 function addDirBinding(id){ var domain = $("input[name='domain']").val(); var dir_name = $("select[name='dirName']").val(); if(domain == '' || dir_name == '' || dir_name == null){ layer.msg(lan.site.d_s_empty,{icon:2}); return; } var data = 'id='+id+'&domain='+domain+'&dir_name='+dir_name; $.post('/site/add_dir_bind',data,function(rdata){ dirBinding(id); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); } //删除子目录绑定 function delDirBind(id,siteId){ layer.confirm(lan.site.s_bin_del,{icon:3,closeBtn:2},function(){ $.post('/site/del_dir_bind','id='+id,function(rdata){ dirBinding(siteId); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); }); } //301重定向 function to301(siteName, type, obj){ // 设置 页面展示 if(type == 1) { var obj = { type: 1, keep_path: 1, to: 'http://', from: '', r_type: '', type: 'path' }; var keep_path_ht = obj.keep_path == 1 ? 'checked="checked"' : ''; var redirect_title = type == 1 ? '创建重定向' : '修改重定向[' + obj.redirectname + ']'; layer.open({ type: 1, area: ['650px','270px'], title: redirect_title, closeBtn: 1, shift: 5, btn: ['提交','关闭'], shadeClose: false, content: "
    \
    \
    \ 保留URI参数\ \ \
    \
    \
    重定向类型\
    \ \ 重定向方式\ \
    \
    \
    \ 重定向源\
    \ \ 目标URL\ \
    \
    \
    ", success:function(index,layero){ }, yes:function(index,index1){ var keep_path = $('[name="keep_path"]').prop('checked') ? 1 : 0; var r_type = $('[name="r_type"]').val(); var type = $('[name="type"]').val(); var from = $('[name="from"]').val(); var to = $('[name="to"]').val(); var pdata = {siteName: siteName, type: type,r_type: r_type,from: from,to: to,keep_path: keep_path}; $.post('/site/set_redirect', pdata, function(data) { if (data.status) { layer.close(index); to301(siteName); } else { layer.msg(data.msg, {icon: 2}); } },'json'); } }); } if (type == 2) { $.post('/site/del_redirect', { siteName: siteName, id: obj, }, function(res) { if (res.status == true) { layer.msg('删除成功', {time: 1000,icon: 1}); to301(siteName); } else { layer.msg(res.msg, {time: 1000,icon: 2}); } },'json'); return } if (type == 3) { var laoding = layer.load(); var data = {siteName: siteName,id: obj}; $.post('/site/get_redirect_conf', data, function(res) { layer.close(laoding); if (res.status == true) { var mBody = "
    \ \
    \
      \
    • 此处为重定向配置文件,若您不了解配置规则,请勿随意修改.
    • \
    \
    \
    "; var editor; var index = layer.open({ type: 1, title: '编辑配置文件', closeBtn: 1, shadeClose: true, area: ['500px', '500px'], btn: ['提交','关闭'], content: mBody, success: function () { editor = CodeMirror.fromTextArea(document.getElementById("configRedirectBody"), { extraKeys: {"Ctrl-Space": "autocomplete"}, lineNumbers: true, matchBrackets:true, }); editor.focus(); $(".CodeMirror-scroll").css({"height":"300px","margin":0,"padding":0}); $("#onlineEditFileBtn").unbind('click'); }, yes:function(index,layero){ $("#configRedirectBody").empty().text(editor.getValue()); var load = layer.load(); var data = { siteName: siteName, id: obj, config: editor.getValue(), }; $.post('/site/save_redirect_conf', data, function(res) { layer.close(load) if (res.status == true) { layer.msg('保存成功', {icon: 1}); layer.close(index); } else { layer.msg(res.msg, {time: 3000,icon: 2}); } },'json'); return true; }, }); } else { layer.msg('请求错误!!', {time: 3000,icon: 2}); } }); return } var body = '
    \
    \ \
    \
    \ \ \ \ \ \ \ \ \ \ \ \ \
    重定向类型重定向方式保留URL参数状态操作
    \
    \
    '; $("#webedit-con").html(body); var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/get_redirect','siteName='+siteName, function(res) { layer.close(loadT); $("#md-301-loading").remove(); if (res.status) { var data = res.data.result; data.forEach(function(item){ var lan_r_type = item.r_type == 0 ? "临时重定向" : "永久重定向"; var keep_path = item.keep_path == 0 ? "不保留" : "保留"; var switchProxy = ''; if (!item['status']){ switchProxy = ''; } let tmp = '\ '+item.r_from+'\ '+lan_r_type+'\ '+keep_path+'\ '+switchProxy+'\ \ 详细 | \ 删除\ \ '; $("#md-301-body").append(tmp); }) } else { layer.msg(res.msg, {icon:2}); } },'json'); } function toRedirect(siteName, redirect_id, type){ if (type == 10 || type == 11) { //[11]启动 或 停止[10] var status = type == 10 ? '0' : '1'; var loading = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); var pdata = {siteName: siteName, 'status':status,'id':redirect_id }; $.post('/site/set_redirect_status', pdata, function(rdata) { layer.close(loading); if (!rdata.status){ layer.msg(res.msg, {time: 3000,icon: 2}); return; } showMsg("设置成功",function(){ to301(siteName); },{icon: 1,time:2000}); },'json'); return; } } //反向代理 function toProxy(siteName, type, obj) { // 设置 页面展示 if(type == 1) { var proxy_title = "创建反向代理"; if (typeof(obj) != 'undefined'){ proxy_title = "编辑反向代理"; } layer.open({ type: 1, area: '650px', title: proxy_title, closeBtn: 1, shift: 5, shadeClose: false, btn: ['提交','关闭'], content: "
    \
    \ 开启代理\
    \ \ \
    \ 是否缓存\ \ \
    \
    \ 是否跨域\ \ \
    \
    \
    \
    \ 名称\
    \ \
    \
    \ \
    \ 代理目录\
    \ \
    \
    \
    \ 目标URL\
    \ \ 发送域名\ \
    \
    \ \
    \
      \
    • 代理目录:访问这个目录时将会把目标URL的内容返回并显示
    • \
    • 目标URL:可以填写你需要代理的站点,目标URL必须为可正常访问的URL,否则将返回错误
    • \
    • 发送域名:将域名添加到请求头传递到代理服务器,默认为目标URL域名,若设置不当可能导致代理无法正常运行
    • \
    \
    \
    ", success:function(){ if (typeof(obj) != 'undefined'){ console.log(obj); $('input[name="name"]').val(obj['name']).attr('readonly','readonly').addClass('disabled'); if (obj['open_cache'] == 'on'){ $("input[name='open_cache']").prop("checked",true); $('#cache_time').show(); } if (obj['open_cors'] == 'on'){ $("input[name='open_cors']").prop("checked",true); } if (obj['open_proxy'] == 'on'){ $("input[name='open_proxy']").prop("checked",true); } $('input[name="from"]').val(obj['from']); $('input[name="to"]').val(obj['to']); var url = obj['to']; var 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])$/; url = url.replace(/^http[s]?:\/\//, ''); url = url.replace(/(:|\?|\/|\\)(.*)$/, ''); if (ip_reg.test(url)) { $("[name='host']").val('$host'); } else { $("[name='host']").val(url); } $('input[name="id"]').val(obj['id']); $('input[name="cache_time"]').val(obj['cache_time']); } $('input[name="to"]').on('keyup', function(){ var url = $(this).val(); var 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])$/; url = url.replace(/^http[s]?:\/\//, ''); url = url.replace(/(:|\?|\/|\\)(.*)$/, ''); if (ip_reg.test(url)) { $("[name='host']").val('$host'); } else { $("[name='host']").val(url); } }); $("#open_proxy").click(function(){ var status = $("input[name='open_proxy']").prop("checked")==true?1:0; if(status==1){ $("input[name='open_proxy']").prop("checked",false); }else{ $("input[name='open_proxy']").prop("checked",true); } }); $('#open_cache').click(function(){ var status = $("input[name='open_cache']").prop("checked")==true?1:0; if(status==1){ $('#cache_time').hide(); $("input[name='open_cache']").prop("checked",false); }else{ $('#cache_time').show(); $("input[name='open_cache']").prop("checked",true); } }); $('#open_cors').click(function(){ var status = $("input[name='open_cors']").prop("checked")==true?1:0; if(status==1){ $("input[name='open_cors']").prop("checked",false); }else{ $("input[name='open_cors']").prop("checked",true); } }); }, yes:function(index,layer_ro){ var data = $('#form_proxy').serializeArray(); var t = {}; t['name'] = 'siteName'; t['value'] = siteName; data.push(t); // console.log(data); var loading = layer.msg('正在'+proxy_title+'...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_proxy',data, function(res) { layer.close(loading); if (!res.status){ layer.msg(res.msg, {icon: 2,time:10000}); return; } showMsg(proxy_title+"成功!",function(){ layer.close(index); toProxy(siteName); },{icon: 1, time:2000}); },'json'); } }); } if (type == 2) { var loading = layer.msg('正在删除中...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/del_proxy', {siteName: siteName,id: obj,}, function(res) { layer.close(loading); if (res.status == true) { showMsg('删除成功', function(){ toProxy(siteName); },{time: 1000,icon: 1}); } else { layer.msg(res.msg, {time: 1000,icon: 2}); } },'json'); return } if (type == 3) { var laoding = layer.load(); var data = {siteName: siteName,id: obj}; $.post('/site/get_proxy_conf', data, function(res) { layer.close(laoding); if (!res.status){ layer.msg('请求错误!!', {time: 3000,icon: 2}); return; } var mBody = "
    \ \
    \
      \
    • 此处为反向代理配置文件,若您不了解配置规则,请勿随意修改.
    • \
    \
    \
    "; var editor; function saveDataFunc(){ $("#configProxyBody").empty().text(editor.getValue()); var load = layer.load(); var data = { siteName: siteName, id: obj, config: editor.getValue(), }; $.post('/site/save_proxy_conf', data, function(res) { layer.close(load) if (res.status == true) { layer.msg('保存成功', {icon: 1}); layer.close(index); } else { layer.msg(res.msg, {time: 3000,icon: 2}); } },'json'); } var index = layer.open({ type: 1, title: '编辑配置文件', closeBtn: 1, shadeClose: true, area: ['500px', '500px'], btn: ['提交','关闭'], content: mBody, success: function () { editor = CodeMirror.fromTextArea(document.getElementById("configProxyBody"), { lineNumbers: true, matchBrackets:true, extraKeys: { "Ctrl-Space": "autocomplete", "Ctrl-F": "findPersistent", "Ctrl-H": "replaceAll", "Ctrl-S": function() { saveDataFunc(); }, "Cmd-S":function() { saveDataFunc(); } } }); editor.focus(); $(".CodeMirror-scroll").css({"height":"300px","margin":0,"padding":0}); $("#onlineEditFileBtn").unbind('click'); }, yes:function(index,layero){ saveDataFunc(); return true; }, }); },'json'); return; } if (type == 10 || type == 11) { //[11]启动 或 停止[10] status = type==10 ? '0' : '1'; var loading = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_proxy_status', {siteName: siteName,'status':status,'id':obj}, function(rdata) { layer.close(loading); if (!rdata.status){ layer.msg(res.msg, {time: 3000,icon: 2}); return; } showMsg("设置成功",function(){ toProxy(siteName); },{icon: 1,time:2000}); },'json'); return; } if (type == 20 || type == 21) { //[20] 开始缓存 或 [21] 停止缓存 var status = type == 20 ? 'on' : ''; obj['open_cache'] = status; obj['siteName'] = siteName; var loading = layer.msg('正在提交请求...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_proxy',obj, function(rdata) { layer.close(loading); if (!rdata.status){ layer.msg(rdata.msg, {icon: 2,time:2000}); return; } showMsg("设置成功!",function(){ toProxy(siteName); },{icon: 1, time:2000}); },'json'); return; } var body = '
    \
    \ \
    \
    \ \ \ \ \ \ \ \ \ \ \ \ \
    名称代理目录目标地址缓存状态操作
    \
    \
    '; $("#webedit-con").html(body); var loading = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); $.post("/site/get_proxy_list", {siteName: siteName},function (res) { layer.close(loading); if (!res.status){ layer.msg(res.msg, {icon:2}); return; } var data = res.data.result; for (var i = 0; i < data.length; i++) { var item = data[i]; var switchProxy = ''; if (!item['status']){ switchProxy = ''; } var openCache = '未开启'; if (item['open_cache'] == 'on'){ openCache = '已开启'; } let tmp = '\ '+item.name+'\ '+item.from+'\ '+item.to+'\ '+openCache+'\ '+switchProxy+'\ \ 详细 |\ 编辑 |\ 删除\ \ '; $("#md-301-body").append(tmp); } $('#md-301-body .detail').click(function(){ var index = $(this).data('index'); toProxy(siteName, 3 ,data[index]['id']); }); $('#md-301-body .edit').click(function(){ var index = $(this).data('index'); toProxy(siteName, 1 ,data[index]); }); $('#md-301-body .delete').click(function(){ var index = $(this).data('index'); toProxy(siteName, 2 ,data[index]['id']); }); $('#md-301-body .cache').click(function(){ var index = $(this).data('index'); if ($(this).hasClass('on')){ toProxy(siteName, 21 ,data[index]); } else{ toProxy(siteName, 20 ,data[index]); } }); },'json'); ///////// } //证书夹 function sslAdmin(siteName){ var loadT = layer.msg('正在提交任务...',{icon:16,time:0,shade: [0.3, '#000']}); $.get('/site/get_cert_list',function(data){ layer.close(loadT); var rdata = data['data']; var tbody = ''; for(var i=0;i\ '+rdata[i].dns.join('
    ')+'\ '+rdata[i].notAfter+'\ '+rdata[i].issuer.split(' ')[0]+'\ 部署 | 删除\ ' } var txt = '
    \ \
    \ '+tbody+'\
    域名信任名称到期时间品牌操作
    '; $(".tab-con").html(txt); },'json'); } //删除证书 function removeSsl(certName){ safeMessage('删除证书','您真的要从证书夹删除证书吗?',function(){ var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/remove_cert',{certName:certName},function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); $("#ssl_admin").click(); },'json'); }); } //从证书夹部署 function setCertSsl(certName,siteName){ var loadT = layer.msg('正在部署证书...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_cert_to_site',{certName:certName,siteName:siteName},function(rdata){ layer.close(loadT); showMsg(rdata.msg, function(){ $(".tab-nav span:first-child").click(); },{icon:rdata.status?1:2},2000); },'json'); } //ssl function setSSL(id,siteName){ // Let\'s Encrypt // 暂时关闭 Let 申请模式 var sslHtml = '\
    \ 当前证书 - [未部署SSL]\ \ ACME\ 证书夹' + '
    \
    ' + '
    '; $("#webedit-con").html(sslHtml); $(".tab-nav span").click(function(){ $(this).addClass("on").siblings().removeClass("on"); }); opSSL('now',id,siteName); } //设置httpToHttps function httpToHttps(siteName){ var isHttps = $("#toHttps").prop('checked'); if(isHttps){ layer.confirm('关闭强制HTTPS后需要清空浏览器缓存才能看到效果,继续吗?',{icon:3,title:"关闭强制HTTPS"},function(){ $.post('/site/close_to_https','siteName='+siteName,function(rdata){ layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); }); }else{ $.post('/site/http_to_https','siteName='+siteName,function(rdata){ layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); } } function deleteSSL(type,id,siteName){ $.post('/site/delete_ssl','site_name='+siteName+'&ssl_type='+type,function(rdata){ showMsg(rdata.msg, function(){ opSSL(type,id,siteName); },{icon:rdata.status?1:2}, 2000); },'json'); } function deploySSL(type,id,siteName){ $.post('/site/deploy_ssl','site_name='+siteName+'&ssl_type='+type,function(rdata){ showMsg(rdata.msg, function(){ if (rdata.status){ $('#now_ssl').click(); } else{ opSSL(type,id,siteName); } },{icon:rdata.status?1:2}, 2000); },'json'); } function renewSSL(type,id,siteName){ showSpeedWindow('正在续签...', 'site.get_let_logs', function(layers,index){ $.post('/site/renew_ssl','site_name='+siteName+'&ssl_type='+type,function(rdata){ showMsg(rdata.msg, function(){ if (rdata.status){ layer.close(index); opSSL(type,id,siteName); } },{icon:rdata.status?1:2}, 2000); },'json'); }); } function renderDnsapiHtml(data){ var fields = data.data; var fields_html = ''; for (var d in fields) { fields_html += ""+d+"\
    \ \
    "; } layer.open({ type: 1, area: '500px', title: '设置'+data['title']+'接口', closeBtn: 1, shift: 5, shadeClose: true, btn:["确定","取消"], content: "
    \
    \ DNSAPI类型\
    \ \
    \
    \
    \ "+fields_html+"\
    \
    \
    \
      \
    • 使用【"+data['title']+"】的API接口自动解析申请SSL
    • \
    \
    \
    \
    ", yes:function(index,l) { var type_name = $('select[name="type_name"]').val(); var data_field = {}; for (var d in fields) { data_field[d] = $('input[name="'+d+'"]').val(); } $.post('/site/set_dnsapi', {'type':type_name,'data':JSON.stringify(data_field)}, function(rdata){ showMsg(rdata.msg, function(){ if (rdata.status){ layer.close(index); renderDnsapi(); } },{icon:rdata.status?1:2}); },'json'); } }); } function renderDnsapi(){ $('#dnsapi_set').css('display', 'none'); $.post('/site/get_dnsapi', {}, function(data){ var dnsapi_option = ''; for (var i = 0; i < data.length; i++) { dnsapi_option+=''; } $('#dnsapi_option select').html(dnsapi_option); $('#dnsapi_option select').on('change',function(){ var val = $(this).val(); var index = $('#dnsapi_option option:selected').attr('index'); if (val == 'none'){ $('#dnsapi_option button').css('display','none'); } else { $('#dnsapi_option button').css('display','inline-block'); if (!(data[index]['title'].indexOf('[')>0)){ renderDnsapiHtml(data[index]); } } }); $('#dnsapi_set').unbind('click').on('click', function(){ var index = $('#dnsapi_option option:selected').attr('index'); renderDnsapiHtml(data[index]); }); },'json'); } function opSSLNow(type, id, siteName, callback){ var now = '
    \ \
    \
    密钥(KEY)
    \
    证书(PEM格式)
    \
    \
    \ \
    \
    \
      \
    • 粘贴您的*.key以及*.pem内容,然后保存即可。
    • \
    • 如果浏览器提示证书链不完整,请检查是否正确拼接PEM证书
    • PEM格式证书 = 域名证书.crt + 根证书(root_bundle).crt
    • \
    • 在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点
    • \
    '; $(".tab-con").html(now); var key = ''; var csr = ''; var loadT = layer.msg('正在提交任务...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/get_ssl','site_name='+siteName,function(data){ layer.close(loadT); var rdata = data['data']; if (rdata['cert_data']){ var issuer = rdata['cert_data']['issuer'].split(" "); var domains = rdata['cert_data']['dns'].join("、"); var cert_data = "
    \
    证书品牌:"+issuer[0]+"
    \
    到期时间:剩余"+rdata['cert_data']['endtime']+"天到期
    \
    \
    \
    认证域名:"+domains+"
    \
    强制HTTPS:\ \
    \
    "; $(".ssl_state_info").html(cert_data); $(".ssl_state_info").css('display','block'); } if(rdata.key == false){ rdata.key = ''; } else { $(".ssl-btn").append(''); } if(rdata.csr == false){ rdata.csr = ''; } $("#key").val(rdata.key); $("#csr").val(rdata.csr); $("#toHttps").attr('checked',rdata.httpTohttps); if(rdata.status){ $('.warning_info').css('display','none'); $(".ssl-btn").append(""); $('#now_ssl').html('当前证书 - [已部署SSL]'); } else{ $('.warning_info').css('display','block'); $('#now_ssl').html('当前证书 - [未部署SSL]'); } if (typeof (callback) != 'undefined'){ callback(rdata); } },'json'); } function opSSLAcme(type, id, siteName, callback){ var acme = '
    \
    \
    \ 验证方式\
    \ \ \ \ \
    \
    \ \ \
    \
    \ \ \
    \
    \
    \
    \ 邮箱\ \
    \ \
    \ 域名\
      \
      \
      \ \
      \
        \
      • 申请之前,请确保域名已解析,如未解析会导致审核失败
      • \
      • 由ACME免费申请证书,有效期3个月,支持多域名。默认会自动续签
      • \
      • 若您的站点使用了CDN或301重定向会导致续签失败
      • \
      • 在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点
      \ \
      '; $(".tab-con").html(acme); $('input[name="apply_type"]').on('change', function(){ var val = $(this).val(); if (val == 'file'){ $('#dnsapi_option').css('display','none'); $('#wildcard_domain_block').css('display','none'); $('#dns_alias').css('display','none'); } else { $('#dnsapi_option').css('display','block'); $('#wildcard_domain_block').css('display','block'); // 关闭,咱不开发,没有验证通过 $('#dns_alias').css('display','block'); } }); renderDnsapi(); $.post('/site/get_ssl','site_name='+siteName+'&ssl_type=acme', function(data){ var rdata = data['data']; if(rdata.csr == false){ $.post('/site/get_site_domains','id='+id, function(rdata) { var data = rdata['data']; var opt=''; for(var i=0;i'+data.domains[i].name +''; } } $("input[name='admin_email']").val(data.email); $("#ymlist").html(opt); $("#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); } }) $(".letsApply").click(function(){ var c = $("#ymlist input[type='checkbox']"); var str = []; var domains = ''; for(var i=0; i\
      证书(PEM格式)
      \ \
      \ \ \
      \ \
        \
      • 已为您自动生成ACME免费证书
      • \
      • 由ACME免费申请证书,有效期3个月,支持多域名。默认会自动续签
      • \
      • 如需使用其他SSL,请切换其他证书后粘贴您的KEY以及PEM内容,然后保存即可。
      • \
      '; $(".tab-con").html(acme); if (rdata['cert_data']){ var issuer = rdata['cert_data']['issuer'].split(" "); var domains = rdata['cert_data']['dns'].join("、"); var cert_data = "
      \
      证书品牌:"+issuer[0]+"
      \
      到期时间:剩余"+rdata['cert_data']['endtime']+"天到期
      \
      \
      \
      认证域名:"+domains+"
      \
      "; $(".ssl_state_info").html(cert_data); $(".ssl_state_info").css('display','block'); } },'json'); } function opSSLLet(type, id, siteName, callback){ var lets = '
      \
      \
      \ 验证方式\
      \ \ \ \ \
      \
      \ \ \
      \
      \ \ \
      \
      \
      \
      \ 邮箱\ \
      \
      \ 域名\
        \
        \
        \ \
        \
          \
        • 申请之前,请确保域名已解析,如未解析会导致审核失败
        • \
        • Let\'s Encrypt免费证书,有效期3个月,支持多域名。默认会自动续签
        • \
        • 若您的站点使用了CDN或301重定向会导致续签失败
        • \
        • 在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点
        • \
        \
        '; $(".tab-con").html(lets); $('input[name="apply_type"]').on('change', function(){ var val = $(this).val(); if (val == 'file'){ $('#dnsapi_option').css('display','none'); $('#wildcard_domain_block').css('display','none'); } else { $('#dnsapi_option').css('display','block'); $('#wildcard_domain_block').css('display','block'); } }); renderDnsapi(); $.post('/site/get_ssl', 'site_name='+siteName+'&ssl_type=lets', function(data){ var rdata = data['data']; if(rdata.csr == false){ $.post('/site/get_site_domains','id='+id, function(rdata) { var data = rdata['data']; var opt=''; for(var i=0;i'+data.domains[i].name+'' } } $("input[name='admin_email']").val(data.email); $("#ymlist").html(opt); $("#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); } }) $(".letsApply").click(function(){ var c = $("#ymlist input[type='checkbox']"); var str = []; var domains = ''; for(var i=0; i\
        证书(PEM格式)
        \ \
        \ \ \ \
        \ \
          \
        • 已为您自动生成Let\'s Encrypt免费证书
        • \
        • 由Let\'s Encrypt免费申请证书,有效期3个月,支持多域名。默认会自动续签
        • \
        • 如需使用其他SSL,请切换其他证书后粘贴您的KEY以及PEM内容,然后保存即可。
        • \
        '; $(".tab-con").html(lets); if (rdata['cert_data']){ var issuer = rdata['cert_data']['issuer'].split(" "); var domains = rdata['cert_data']['dns'].join("、"); var cert_data = "
        \
        证书品牌:"+issuer[0]+"
        \
        到期时间:剩余"+rdata['cert_data']['endtime']+"天到期
        \
        \
        \
        认证域名:"+domains+"
        \
        "; $(".ssl_state_info").html(cert_data); $(".ssl_state_info").css('display','block'); } },'json'); } //SSL function opSSL(type, id, siteName, callback){ switch(type){ case 'lets':opSSLLet(type, id, siteName, callback);break; case 'acme':opSSLAcme(type, id, siteName, callback);break; case 'now':opSSLNow(type, id, siteName, callback);break; default:layer.msg("错误类型", {icon:5});break; } } //开启与关闭SSL function ocSSL(action,siteName){ var loadT = layer.msg('正在获取证书列表,请稍后..',{icon:16,time:0,shade: [0.3, '#000']}); $.post("/site/"+action,'siteName='+siteName+'&updateOf=1',function(rdata){ layer.close(loadT) if(!rdata.status){ if(!rdata.out){ layer.msg(rdata.msg,{icon:rdata.status?1:2}); setSSL(siteName); return; } data = "

        证书获取失败:


        " for(var i=0;i" + "

        错误类型: "+rdata.out[i].Type+"

        " + "

        详情: "+rdata.out[i].Detail+"

        " + "
        "; } layer.msg(data,{icon:2,time:0,shade:0.3,shadeClose:true}); return; } layer.msg(rdata.msg,{icon:rdata.status?1:2}); if(action == 'close_ssl_conf'){ layer.msg('已关闭SSL,请务必清除浏览器缓存后再访问站点!',{icon:1,time:5000}); } $(".tab-nav .on").click(); },'json'); } //生成SSL function newSSL(siteName, id, domains){ showSpeedWindow('正在申请...', 'site.get_let_logs', function(layers,index){ var pdata = {}; pdata['siteName'] = siteName; pdata['domains'] = domains; pdata['email'] = $("input[name='admin_email']").val(); if($("#checkDomain").prop("checked")){ pdata['force'] = 'true'; } if($("#wildcard_domain").prop("checked")){ pdata['wildcard_domain'] = 'true'; } var apply_type = $('input[name="apply_type"]:checked').val(); pdata['apply_type'] = apply_type; if (apply_type == 'dns'){ pdata['dnspai'] = $('#dnsapi_option option:selected').val(); } $.post('/site/create_let',pdata,function(rdata){ showMsg(rdata.msg, function(){ layer.close(index); if(rdata.status){ $(".tab-nav span:first-child").click(); } },{icon:rdata.status?1:2}, 3000); },'json'); }); } // 手动申请dns提示 function newAcmeHandApplyNotice(siteName, id, domains, data){ // console.log(siteName, id, domains, data); layer.open({ type: 1, area: '700px', title: '手动解析TXT记录', closeBtn: 1, shift: 5, shadeClose: true, btn:["验证", "取消"], content:'
        \
        请按以下列表做TXT解析:
        \
        \
        \ \ \ \
        解析域名记录值类型必需
        \
        \
        \
          \
        • 解析域名需要一定时间来生效,完成所以上所有解析操作后,请等待1分钟后再点击【验证】按钮
        • \
        • 可通过CMD命令来手动验证域名解析是否生效: nslookup -q=txt _acme-challenge.xx.cn
        • \
        • 若您使用的是阿里云DNS,DnsPod等等作为DNS,可使用DNS接口自动解析
        • \
        \
        ', success:function(){ var list = ''; for (var i = 0; i < data.length; i++) { list += ''; list += ''+data[i]['domain']+''; list += ''+data[i]['val']+''; list += ''+data[i]['type']+''; if (data[i]['must']){ list += '必需'; } else{ list += '可选'; } list += ''; } $('#acme_hand_ssl_notice tbody').html(list); if (data.length>0){ var help_txt = "可通过CMD命令来手动验证域名解析是否生效: nslookup -q=txt "+data[0]['domain']; $('#acme_hand_ssl_notice_help li:eq(1)').text(help_txt); } }, yes:function(layero,index){ layer.close(layero); showSpeedWindow('正在由ACME申请手动SSL...', 'site.get_acme_logs', function(layers,index){ var pdata = {}; pdata['siteName'] = siteName; pdata['domains'] = domains; pdata['email'] = $("input[name='admin_email']").val(); if($("#checkDomain").prop("checked")){ pdata['force'] = 'true'; } if($("#wildcard_domain").prop("checked")){ pdata['wildcard_domain'] = 'true'; } var apply_type = $('input[name="apply_type"]:checked').val(); pdata['apply_type'] = apply_type; if (apply_type == 'dns'){ pdata['dnspai'] = $('#dnsapi_option option:selected').val(); } pdata['dns_alias'] = $("input[name='dns_alias']").val(); pdata['renew'] = 'true'; $.post('/site/create_acme',pdata,function(rdata){ showMsg(rdata.msg, function(){ if (rdata.status){ layer.close(index); $(".tab-nav span:first-child").click(); } },{icon:rdata.status?1:2}, 3000); },'json'); }); } }); } function newAcmeSSL(siteName, id, domains){ showSpeedWindow('正在由ACME申请...', 'site.get_acme_logs', function(layers,index){ var pdata = {}; pdata['siteName'] = siteName; pdata['domains'] = domains; pdata['email'] = $("input[name='admin_email']").val(); if($("#checkDomain").prop("checked")){ pdata['force'] = 'true'; } if($("#wildcard_domain").prop("checked")){ pdata['wildcard_domain'] = 'true'; } var apply_type = $('input[name="apply_type"]:checked').val(); pdata['apply_type'] = apply_type; if (apply_type == 'dns'){ pdata['dnspai'] = $('#dnsapi_option option:selected').val(); } pdata['dns_alias'] = $("input[name='dns_alias']").val(); $.post('/site/create_acme',pdata,function(rdata){ showMsg(rdata.msg, function(){ if (rdata.status){ layer.close(index); if (rdata.msg == '手动解析'){ newAcmeHandApplyNotice(siteName, id, domains, rdata.data); } else{ $(".tab-nav span:first-child").click(); } } },{icon:rdata.status?1:2}, 3000); },'json'); }); } //保存SSL function saveSSL(siteName){ var data = 'type=1&siteName='+siteName+'&key='+encodeURIComponent($("#key").val())+'&csr='+encodeURIComponent($("#csr").val()); var loadT = layer.msg(lan.site.saving_txt,{icon:16,time:20000,shade: [0.3, '#000']}) $.post('/site/set_ssl',data,function(rdata){ layer.close(loadT); if(rdata.status){ layer.msg(rdata.msg,{icon:1}); $(".ssl-btn").find(".btn-default").remove(); $(".ssl-btn").append(""); } else { layer.msg(rdata.msg,{icon:2,time:0,shade:0.3,shadeClose:true}); } },'json'); } //PHP版本 function phpVersion(siteName){ $.post('/site/get_site_php_version','siteName='+siteName,function(version){ // console.log(version); if(version.status === false){ layer.msg(version.msg,{icon:5}); return; } $.post('/site/get_php_version',function(data){ var rdata = data.data; var versionSelect = "
        \
        \ PHP版本\
        \ \ \
        \ \
        \
          \
        • 请根据您的程序需求选择版本
        • \
        • 若非必要,请尽量不要使用PHP5.2,这会降低您的服务器安全性;
        • \
        • PHP7不支持mysql扩展,默认安装mysqli以及mysql-pdo。
        • \
        \
        \ "; $("#webedit-con").html(versionSelect); //验证PHP版本 $("select[name='phpVersion']").change(function(){ if($(this).val() == '52'){ var msgerr = 'PHP5.2在您的站点有漏洞时有跨站风险,请尽量使用PHP5.3以上版本!'; $('#php_w').text(msgerr); }else{ $('#php_w').text(''); } }) },'json'); },'json'); } //设置PHP版本 function setPHPVersion(siteName){ var data = 'version='+$("#phpVersion").val()+'&siteName='+siteName; var loadT = layer.msg('正在保存...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_php_version',data,function(rdata){ layer.close(loadT); layer.msg(rdata.msg,{icon:rdata.status?1:2}); },'json'); } //配置文件 function configFile(webSite){ var info = syncPost('/site/get_host_conf', {siteName:webSite}); $.post('/files/get_body','path='+info['host'],function(rdata){ var mBody = "
        \ \
        \ \
          \
        • 此处为站点主配置文件,若您不了解配置规则,请勿随意修改.
        • \
        \
        \
        "; $("#webedit-con").html(mBody); var editor = CodeMirror.fromTextArea(document.getElementById("configBody"), { extraKeys: {"Ctrl-Space": "autocomplete"}, lineNumbers: true, matchBrackets:true, }); $(".CodeMirror-scroll").css({"height":"300px","margin":0,"padding":0}); $("#SaveConfigFileBtn").click(function(){ $("#configBody").empty(); $("#configBody").text(editor.getValue()); saveConfigFile(webSite,rdata.data.encoding, info['host']); }) },'json'); } //保存配置文件 function saveConfigFile(webSite,encoding,path){ var data = 'encoding='+encoding+'&data='+encodeURIComponent($("#configBody").val())+'&path='+path; var loadT = layer.msg('保存中...',{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/save_host_conf',data,function(rdata){ layer.close(loadT); if(rdata.status){ layer.msg(rdata.msg,{icon:1}); }else{ layer.msg(rdata.msg,{icon:2,time:0,shade:0.3,shadeClose:true}); } },'json'); } //伪静态 function rewrite(siteName){ $.post("/site/get_rewrite_list", 'siteName='+siteName,function(rdata){ var info = syncPost('/site/get_rewrite_conf', {siteName:siteName}); var filename = info['rewrite']; $.post('/files/get_body','path='+filename,function(fileBody){ var centent = fileBody['data']['data']; var rList = ''; for(var i=0;i"; } else { rList += ""; } } var webBakHtml = "
        \
        \ \
        \ \ \
          \
        • 请选择您的应用,若设置伪静态后,网站无法正常访问,请尝试设置回default
        • \
        • 您可以对伪静态规则进行修改,修改完后保存即可。
        • \
        \
        "; $("#webedit-con").html(webBakHtml); var editor = CodeMirror.fromTextArea(document.getElementById("rewriteBody"), { extraKeys: {"Ctrl-Space": "autocomplete"}, lineNumbers: true, matchBrackets:true, }); $(".CodeMirror-scroll").css({"height":"300px","margin":0,"padding":0}); $("#SetRewriteBtn").click(function(){ $("#rewriteBody").empty(); $("#rewriteBody").text(editor.getValue()); setRewrite(filename, encodeURIComponent(editor.getValue())); }); $("#SetRewriteBtnTel").click(function(){ $("#rewriteBody").empty(); $("#rewriteBody").text(editor.getValue()); setRewriteTel(); }); $("#myRewrite").change(function(){ var rewriteName = $(this).val(); if(rewriteName == '0'){ rpath = filename; }else{ var info = syncPost('/site/get_rewrite_tpl', {tplname:rewriteName}); if (!info['status']){ layer.msg(info['msg']); return; } rpath = info['data']; } $.post('/files/get_body','path='+rpath,function(fileBody){ $("#rewriteBody").val(fileBody['data']['data']); editor.setValue(fileBody['data']['data']); },'json'); }); },'json'); },'json'); } //设置伪静态 function setRewrite(filename,data){ var data = 'data='+data+'&path='+filename+'&encoding=utf-8'; var loadT = layer.msg(lan.site.saving_txt,{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_rewrite',data,function(rdata){ layer.close(loadT); if(rdata.status){ layer.msg(rdata.msg,{icon:1}); }else{ layer.msg(rdata.msg,{icon:2,time:0,shade:0.3,shadeClose:true}); } },'json'); } var aindex = null; //保存为模板 function setRewriteTel(act){ aindex = layer.open({ type: 1, shift: 5, closeBtn: 1, area: '320px', //宽高 title: '保存为Rewrite模板', btn:[lan.public.ok,lan.public.cancel], content: '
        \
        \ \
        \
        ', success:function(index){ $("#rewriteName").focus().keyup(function(e){ if(e.keyCode == 13) $("#rewriteNameBtn").click(); }); }, yes:function(index){ name = $("#rewriteName").val(); if(name == ''){ layer.msg(lan.site.template_empty,{icon:5}); return; } var data = 'data='+encodeURIComponent($("#rewriteBody").val())+'&name='+name; var loadT = layer.msg(lan.site.saving_txt,{icon:16,time:0,shade: [0.3, '#000']}); $.post('/site/set_rewrite_tpl',data,function(rdata){ layer.close(loadT); layer.close(index); layer.msg(rdata.msg, {icon:rdata.status?1:5}); },'json'); return; } }); } //修改默认页 function siteDefaultPage(){ stype = getCookie('serverType'); layer.open({ type: 1, area: '460px', title: '修改默认页', closeBtn: 1, shift: 0, content: '
        \ \ \ \ \
        ' }); } function changeDefault(type, obj){ $(obj).attr('disabled', true); $.post('/site/get_site_doc','type='+type, function(rdata){ setTimeout(function(){ $(obj).attr('disabled', false); },3000); if (rdata.status){ var path = rdata.data.path; onlineEditFile(0,path); } },'json'); } function getClassType(){ var select = $('.site_type > select'); $.post('/site/get_site_types',function(rdata){ var rdata = rdata.data; $(select).html(''); $(select).append(''); for (var i = 0; i'+rdata[i]['name']+''); } $(select).bind('change',function(){ var select_id = $(this).val(); getWeb(1,select_id, ''); }) },'json'); } getClassType(); function setClassType(){ $.post('/site/get_site_types',function(rdata){ var rdata = rdata.data; var list = ''; for (var i = 0; i\ 编辑 | 删除\ '; } layer.open({ type: 1, area: '350px', title: '网站分类管理', closeBtn: 1, shift: 0, content: '
        \
        \
        \
        \
        \ \ \ '+list+'\
        名称操作
        \
        \
        ' }); },'json'); } function addClassType(){ var name = $("input[name=type_name]").val(); $.post('/site/add_site_type','name='+name, function(rdata){ showMsg(rdata.msg,function(){ if (rdata.status){ layer.closeAll(); setClassType(); getClassType(); } },{icon:rdata.status?1:2}); },'json'); } function removeClassType(id,name){ if (id == 0){ layer.msg('默认分类不可删除/不可编辑!',{icon:2}); return; } layer.confirm('是否确定删除分类?',{title: '删除分类【'+ name +'】' }, function(){ $.post('/site/remove_site_type','id='+id, function(rdata){ showMsg(rdata.msg,function(){ if (rdata.status){ layer.closeAll(); setClassType(); getClassType(); } },{icon:rdata.status?1:2}); },'json'); }); } function editClassType(id,name){ if (id == 0){ layer.msg('默认分类不可删除/不可编辑!',{icon:2}); return; } layer.open({ type: 1, area: '350px', title: '修改分类管理【' + name + '】', closeBtn: 1, shift: 0, content: "
        \
        \ 分类名称\
        \
        \
        \ \
        \
        " }); $('#site_type_mod').unbind().click(function(){ var _name = $('input[name=site_type_mod]').val(); $.post('/site/modify_site_type_name','id='+id+'&name='+_name, function(rdata){ showMsg(rdata.msg,function(){ if (rdata.status){ layer.closeAll(); setClassType(); getClassType(); } },{icon:rdata.status?1:2}); },'json'); }); } function moveClassTYpe(){ $.post('/site/get_site_types',function(rdata){ var option = ''; for (var i = 0; i'+rdata[i]['name']+''; } layer.open({ type: 1, area: '350px', title: '设置站点分类', closeBtn: 1, shift: 0, content: '
        \
        \
        默认站点\
        \ \
        \
        \
        \
        \
        ' }); },'json'); } function setSizeClassType(){ var data = {}; data['id'] = $('select[name=type_id]').val(); var ids = []; $('table').find('td').find('input').each(function(i,obj){ checked = $(this).prop('checked'); if (checked) { ids.push($(this).val()); } }); data['site_ids'] = JSON.stringify(ids); $.post('/site/set_site_type',data, function(rdata){ showMsg(rdata.msg,function(){ if (rdata.status){ layer.closeAll(); } },{icon:rdata.status?1:2}); },'json'); } // 尝试重启PHP function tryRestartPHP(siteName){ $.post('/site/get_site_php_version','siteName='+siteName,function(data){ var phpversion = data.phpversion; if (phpversion == "00"){ return; } var php_sign = 'php'; if (phpversion.indexOf('yum') > -1){ php_sign = 'php-yum'; phpversion = phpversion.replace('yum',''); } if (phpversion.indexOf('apt') > -1){ php_sign = 'php-apt'; phpversion = phpversion.replace('apt',''); } var reqData = {name: php_sign, func:'restart'} reqData['version'] = phpversion; var loadT = layer.msg('尝试自动重启PHP['+phpversion+']...', { icon: 16, time: 0, shade: 0.3 }); $.post('/plugins/run', reqData, function(data) { layer.close(loadT); layer.msg( 'PHP['+phpversion+']'+(data.status?'重启成功!':'重启失败!'),{icon:data.status?1:2,time:3000,shade: [0.3, '#000']}); },'json'); },'json'); }