function str2Obj(str){ var data = {}; kv = str.split('&'); for(i in kv){ v = kv[i].split('='); data[v[0]] = v[1]; } return data; } function wsOriginPost(method, version, args, callback){ var req_data = {}; req_data['name'] = 'webstats'; req_data['func'] = method; req_data['version'] = version; if (typeof(args) == 'string'){ req_data['args'] = JSON.stringify(str2Obj(args)); } else { req_data['args'] = JSON.stringify(args); } $.post('/plugins/run', req_data, function(data) { if (!data.status){ //错误展示10S layer.msg(data.msg,{icon:0,time:2000,shade: [10, '#000']}); return; } if(typeof(callback) == 'function'){ callback(data); } },'json'); } function wsPost(method, version, args,callback){ var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); wsOriginPost(method, version, args,function(data){ layer.close(loadT); callback(data); }); } function wsPostCallbak(method, version, args,callback){ var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); var req_data = {}; req_data['name'] = 'webstats'; req_data['func'] = method; args['version'] = version; if (typeof(args) == 'string'){ req_data['args'] = JSON.stringify(str2Obj(args)); } else { req_data['args'] = JSON.stringify(args); } $.post('/plugins/callback', req_data, function(data) { layer.close(loadT); if (!data.status){ layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); return; } if(typeof(callback) == 'function'){ callback(data); } },'json'); } function toSecond(val){ if (val>=1000){ val = (val / 1000).toFixed()+"s"; return val; } return val + "ms"; } function makeHoursData(data, type="ip"){ var list = []; var rlist = []; for (var i = 0; i < 24; i++) { if (i<10){ list.push("0"+i) } else { list.push(i+"") } rlist.push(i+"") } var rdata = {}; rdata['key'] = rlist; var tmpdata = {}; for (var i = 0; i < data.length; i++) { var tk = data[i]['time']; var v = data[i]; if (type=='length'){ v['length'] = (v['length']/1024).toFixed(); } tmpdata[tk] = v; } var val = []; for (var i = 0; i < list.length; i++) { var tk = list[i]; if (tmpdata[tk]){ val.push(tmpdata[tk][type]); }else{ val.push(0); } } rdata['value'] = val; // console.log(rdata); return rdata } function makeDayData(data, type="ip") { var rdata = {}; var rdata_key = []; var rdata_val = []; for (var i = 0; i < data.length; i++) { var tk = data[i]['time']; rdata_key.push(tk); var v = data[i][type]; if (type=='length'){ v = (v/1024).toFixed(); } rdata_val.push(v) } rdata['key'] = rdata_key; rdata['value'] = rdata_val; return rdata } function getTime() { var now = new Date(); var hour = now.getHours(); var minute = now.getMinutes(); var second = now.getSeconds(); if (minute < 10) { minute = "0" + minute; } if (second < 10) { second = "0" + second; } var nowdate = hour + ":" + minute + ":" + second; return nowdate; } var ovTimer = null; function wsOverviewRequest(page){ clearInterval(ovTimer); var args = {}; args['site'] = $('select[name="site"]').val(); var query_date = 'today'; if ($('#time_choose').attr("data-name") != ''){ query_date = $('#time_choose').attr("data-name"); } else { query_date = $('#search_time button.cur').attr("data-name"); } args['query_date'] = query_date; args['order'] = $('#time_order button.cur').attr('data-name'); var select_option = $('.indicators-container input:checked').parent().attr('data-name'); console.log($('.indicators-container input:checked').parent().find('span').text()); // console.log(select_option); wsPost('get_overview_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); var list = ''; var data = rdata.data.data; var statData = rdata.data.stat_list; console.log(statData, data); var stat_pv = statData['pv'] == null?0:statData['pv']; var stat_uv = statData['uv'] == null?0:statData['uv']; var stat_ip = statData['ip'] == null?0:statData['ip']; var stat_length = statData['length'] == null?0:statData['length']; var stat_req = statData['req'] == null?0:statData['req']; $('.overview_list .overview_box:eq(0) .ov_num').text(stat_pv); $('.overview_list .overview_box:eq(1) .ov_num').text(stat_uv); $('.overview_list .overview_box:eq(2) .ov_num').text(stat_ip); $('.overview_list .overview_box:eq(3) .ov_num').text(toSize(stat_length)); $('.overview_list .overview_box:eq(4) .ov_num').text(stat_req); var list = []; for (var i = 0; i < data.length; i++) { list.push(data[i][select_option]); } // console.log("list",list); var chat = {}; var is_compare = false; var tmpChatData = { "key":[], "value":[] } if (select_option == 'realtime_traffic' || select_option == 'realtime_request'){ } else { if (args['order'] == 'hour'){ tmpChatData = makeHoursData(data, select_option); } else { tmpChatData = makeDayData(data, select_option); } } chat['yAxis'] = [{ type: 'value', splitNumber: 5, axisLabel: { textStyle: { color: '#a8aab0', fontStyle: 'normal', fontFamily: '微软雅黑', fontSize: 12, }, }, axisLine:{ show: false }, axisTick:{ show: false }, splitLine: { show: true, lineStyle: { color: '#E5E9ED' } } }]; chat['tooltip'] = { show:true, trigger: 'axis', backgroundColor: 'rgba(255,255,255,0.8)', axisPointer: { // 坐标轴指示器,坐标轴触发有效 type: 'line', // 默认为直线,可选为:'line' | 'shadow' lineStyle: { color: 'rgba(150,150,150,0.2)' } }, textStyle: { color: '#666', fontSize: '14px', }, extraCssText: 'width:220px;height:'+(is_compare?'30%':'22%')+';padding:0;box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);"', formatter: function (params) { var htmlStr = ""; for (var i = 0; i < params.length; i++) { var tem = params[i].name; var val = params[i].value; if(args['order'] == 'hour'){ if (tem.indexOf('/') < 0) { tem > 9 ? tem = tem + ":00 - " + tem + ":59" : tem = "0" + tem + ":00 - " + "0" + tem + ":59"; } val > 0 ? val = val : val = '--' } htmlStr += '
' + '' + '' + params[i].seriesName + '' + '' + val + '' + '
' } var res ='
' + tem + '' + (is_compare?trend_name:'') + '' + htmlStr + '
' return res; } } var legendName = $('.indicators-container input:checked').parent().find('span').text() chat['legendData'] = [legendName]; var statEc = echarts.init(document.getElementById('total_num_echart')); var option = { tooltip:chat['tooltip'], backgroundColor:'#fff', legend:{ data:chat['legendData'], left:'center', top:'94%', }, grid: { bottom: '9%', containLabel: true, x: 20, y: 20, x2: 20, y2: 20 }, xAxis: { type: 'category', boundaryGap: false, boundaryGap: false, axisTick: { alignWithLabel: true }, data: tmpChatData["key"], }, yAxis: chat['yAxis'], graphic:[{ type: 'group', right: 330, top: 0, z: 100, children: [{ type: 'text', left: 'center', top: 'center', z: 100, style: { fill: '#ccc', text: args['site'], font: '16px Arial' } }] }], series: [ { name:legendName, data: tmpChatData["value"], type: 'line', smooth: true, itemStyle: { normal: { color:'#3A84FF', lineStyle: { color: "#3A84FF", width:1, }, areaStyle: { color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{ offset: 0, color: 'rgba(58,132,255,0)' }, { offset: 1, color: 'rgba(58,132,255,0.35)' }]), } } }, areaStyle: {} } ] }; statEc.setOption(option); if (select_option == 'realtime_traffic' || select_option == 'realtime_request'){ var xData = []; var yData = []; ovTimer = setInterval(function(){ var select_option = $('.indicators-container input:checked').parent().attr('data-name'); if (select_option != "realtime_traffic" && select_option != 'realtime_request' ){ clearInterval(ovTimer); console.log("get_logs_realtime_info over:"+select_option); return; } wsOriginPost("get_logs_realtime_info",'',{"site":args["site"], "type":select_option} , function(rdata){ var rdata = $.parseJSON(rdata.data); var realtime_traffic = rdata.data['realtime_traffic']; var realtime_request = rdata.data['realtime_request']; realtime_traffic_calc = (realtime_traffic/1024).toFixed() $('.overview_list .overview_box:eq(5) .ov_num').text(realtime_traffic_calc+"kb"); $('.overview_list .overview_box:eq(6) .ov_num').text(realtime_request); var realtime_name = select_option == 'realtime_traffic' ? '实时流量':'每秒请求'; var val = realtime_request; if (select_option == 'realtime_traffic'){ val = realtime_traffic_calc; realtime_name = realtime_name + " "+ realtime_traffic_calc + "kb"; } xData.push(getTime()); yData.push(val); if (xData.length > 20){ xData.shift(); yData.shift(); } statEc.setOption({ xAxis: { data: xData }, series: [{ name: realtime_name, data: yData }] }); }); },2000); } }); } function wsOverview(){ //////////////////////////////////////////////////////////////////////////////////////////////////////// var randstr = getRandomString(10); var html = '
\
\ 网站: \ \ 时间: \
\
\ \ \ \ \
\ \
\ 时段: \
\
\ \ \
\
\
\
\ \
\
\
\ \
\
\

浏览量(PV)?

\

0

\
\
\

访客量(UV)?

\

0

\
\
\

IP数?

\

0

\
\
\

流量?

\

0

\
\
\

请求?

\

0

\
\
\

实时流量?

\

0

\
\
\

每秒请求?

\

0

\
\
\
\
\ 趋势指标: \
\ \ 浏览量(PV)\
\
\ \ 访客量(UV)\
\
\ \ IP数\
\
\ \ 流量(KB)\
\
\ \ 请求\
\
\ \ 实时流量\
\
\ \ 每秒请求\
\
\
\
\
'; $(".soft-man-con").html(html); $('[data-toggle="tooltip"]').tooltip(); //日期范围 laydate.render({ elem: '#time_choose', value:'', range:true, done:function(value, startDate, endDate){ if(!value){ return false; } $('#search_time button').each(function(){ $(this).removeClass('cur'); }); var timeA = value.split('-') var start = $.trim(timeA[0]+'-'+timeA[1]+'-'+timeA[2]) var end = $.trim(timeA[3]+'-'+timeA[4]+'-'+timeA[5]) query_txt = toUnixTime(start + " 00:00:00") + "-"+ toUnixTime(end + " 00:00:00") $('#time_choose').attr("data-name",query_txt); $('#time_choose').addClass("cur"); wsOverviewRequest(1); }, }); $('#ov_refresh').click(function(){ wsOverviewRequest(1); }); $('#time_order button:eq(0)').addClass('cur'); $('#time_order button').click(function(){ $('#time_order button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $(this).addClass('cur'); wsOverviewRequest(1); }); $('#search_time button:eq(0)').addClass('cur'); $('#search_time button').click(function(){ $('#search_time button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $('#time_choose').attr("data-name",''); $('#time_choose').removeClass("cur"); $(this).addClass('cur'); wsOverviewRequest(1); }); $('.indicators-container input').click(function(){ $('.indicators-container input').each(function(){ $(this).removeAttr('checked'); }); $(this).prop({'checked':true}); wsOverviewRequest(1); }); wsPost('get_default_site','',{},function(rdata){ $('select[name="site"]').html(''); var rdata = $.parseJSON(rdata.data); var rdata = rdata.data; var default_site = rdata["default"]; var select = ''; for (var i = 0; i < rdata["list"].length; i++) { if (default_site == rdata["list"][i]){ select += ''; } else{ select += ''; } } $('select[name="site"]').html(select); wsOverviewRequest(1); $('select[name="site"]').change(function(){ wsOverviewRequest(1); }); }); //////////////////////////////////////////////////////////////////////////////////////////////////////// } function wsSitesListRequest(page){ var args = {}; var query_date = 'today'; if ($('#time_choose').attr("data-name") != ''){ query_date = $('#time_choose').attr("data-name"); } else { query_date = $('#search_time button.cur').attr("data-name"); } args['query_date'] = query_date; wsPost('get_site_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); var data = rdata.data; var stat_pv = 0; var stat_uv = 0; var stat_ip = 0; var stat_length = 0; var stat_req = 0; console.log(rdata, data); var list = ''; if (data.length > 0){ for(i in data){ var tmp_pv = 0; var tmp_uv = 0; var tmp_ip = 0; var tmp_length = 0; var tmp_req = 0; if (data[i]['pv'] != null){ tmp_pv = data[i]['pv']; stat_pv += data[i]['pv']; } if (data[i]['uv'] != null){ tmp_uv = data[i]['uv']; stat_uv += data[i]['uv']; } if (data[i]['ip'] != null){ tmp_ip = data[i]['ip']; stat_ip += data[i]['ip']; } if (data[i]['length'] != null){ tmp_length = data[i]['length']; stat_length += data[i]['length']; } if (data[i]['req'] != null){ tmp_req = data[i]['req']; stat_req += data[i]['req']; } list += ''; list += '' + data[i]['site']+''; list += '' + tmp_pv +''; list += '' + tmp_uv +''; list += '' + tmp_ip +''; list += '' + tmp_req +''; list += '' + toSize(tmp_length) +''; list += '设置'; list += ''; } } else{ list += '网站列表为空'; } $('.overview_list .overview_box:eq(0) .ov_num').text(stat_pv); $('.overview_list .overview_box:eq(1) .ov_num').text(stat_uv); $('.overview_list .overview_box:eq(2) .ov_num').text(stat_ip); $('.overview_list .overview_box:eq(3) .ov_num').text(toSize(stat_length)); $('.overview_list .overview_box:eq(4) .ov_num').text(stat_req); var table = '
\ \ \ \ \ \ \ \ \ \\ \ '+ list +'\
网站流览量访客数IP数请求数总流量操作
\
\
'; $('#ws_table').html(table); $(".tablescroll .web_set").click(function(){ var index = $(this).attr('data-id'); var domain = data[index]["site"]; wsPost('get_site_conf', '' ,{"site":domain}, function(rdata){ var rdata = $.parseJSON(rdata.data); var rdata = rdata.data; console.log(rdata); layer.open({ type: 1, title: "【"+domain + "】监控配置", btn: ['保存','取消'], area: ['600px',"380px"], closeBtn: 1, shadeClose: false, content: '
\
\
\ CDN headers\ 排除扩展\ 排除响应状态\ 排除路径\ 排除IP\ 记录请求原文\
\
\ * 准确识别CDN网络IP地址,请注意大小写,如需多个请换行填写\ \
\
\
', success:function(){ var common_tpl_tips = '* 准确识别CDN网络IP地址,请注意大小写,如需多个请换行填写'; var common_tpl_area = ''; $('#site_conf .tab-con textarea').text(rdata['cdn_headers'].join('\n')); $('#site_conf .tab-nav span').click(function(e){ $('#site_conf .tab-nav span').removeClass('on'); $(this).addClass('on'); $('#site_conf .tab-con').html(''); var typename = $(this).attr('data-type'); if (typename == 'cdn_headers'){ var content = $(common_tpl_tips).html('* 准确识别CDN网络IP地址,请注意大小写,如需多个请换行填写').prop('outerHTML'); var area = $(common_tpl_area).html(rdata['cdn_headers'].join('\n')).prop('outerHTML'); content += area; $('#site_conf .tab-con').html(content); } else if (typename == 'exclude_extension'){ var content = $(common_tpl_tips).html('* 排除的请求不写入网站日志,不统计PV、UV、IP,只累计总请求、总流量数,如需多个请换行填写').prop('outerHTML'); var area = $(common_tpl_area).html(rdata['exclude_extension'].join('\n')).prop('outerHTML'); content += area; $('#site_conf .tab-con').html(content); } else if (typename == 'exclude_status'){ var content = $(common_tpl_tips).html('* 排除的请求不写入网站日志,不统计PV、UV、IP,只累计总请求、总流量数,如需多个请换行填写').prop('outerHTML'); var area = $(common_tpl_area).html(rdata['exclude_status'].join('\n')).prop('outerHTML'); content += area; $('#site_conf .tab-con').html(content); } else if (typename == 'exclude_ip'){ var txt = '
* 排除的IP不写入网站日志,不统计PV、UV、IP,只累计总请求、总流量数,如需多个请换行填写
\
* 支持 192.168.1.1-192.168.1.10格式排除区间IP
' var content = $(common_tpl_tips).html(txt).prop('outerHTML'); var area = $(common_tpl_area).html(rdata['exclude_ip'].join('\n')).prop('outerHTML'); content += area; $('#site_conf .tab-con').html(content); } else if (typename == 'record_post_args'){ var txt = '
记录请求原文说明:HTTP请求原文包括客户端请求详细参数,有助于分析或排查异常请求;
\
考虑到HTTP请求原文会占用额外存储空间,默认仅记录500错误请求原文。
' var content = $(common_tpl_tips).html(txt).prop('outerHTML'); var record_post_args = ''; if (rdata['record_post_args']){ record_post_args = 'checked'; } var record_get_403_args = ''; if (rdata['record_get_403_args']){ record_get_403_args = 'checked'; } var check = '
\ \ \
'; content+=check; $('#site_conf .tab-con').html(content); } else if ( typename == 'exclude_url'){ var txt = '* 排除的请求不写入网站日志,不统计PV、UV、IP,只累计总请求、总流量数' var content = $(common_tpl_tips).html(txt).prop('outerHTML'); var _text = ''; var _tmp = rdata['exclude_url']; for(var i = 0; i<10; i++){ if(typeof _tmp[i] == 'undefined'){ _tmp[i] = {mode:'regular',url:''} } _text += '\ \ \ \ \ '; } var list = '
\ \ \ \ \ '+_text+'\
排除方式排除路径
\
'; content += list; $('#site_conf .tab-con').html(content); } }); }, yes:function(){ var select = $('#webstats .tab-nav span'); var select_pos = 0; $('#webstats .tab-nav span').each(function(i){ if ($(this).hasClass('on')){select_pos = i;} }); var args = {"site":domain}; if ( [0,1,2,4].indexOf(select_pos)>-1 ){ var setting_cdn = $('textarea[name="setting-cdn"]').val(); // var list = setting_cdn.split('\n') if ( select_pos == 0 ){ args['cdn_headers'] = setting_cdn; } else if ( select_pos == 1 ){ args['exclude_extension'] = setting_cdn; } else if ( select_pos == 2 ){ args['exclude_status'] = setting_cdn; } else if ( select_pos == 4 ){ args['exclude_ip'] = setting_cdn; } wsPost('set_site_conf','', args, function(rdata){ var rdata = $.parseJSON(rdata.data); layer.msg(rdata.msg,{icon:rdata.status?1:2}); }); } if (select_pos == 3 ){ var list = ""; for (var i = 0; i<10; i++) { var tmp = ""; var url_type = $('select[name="url_type_'+i+'"]').val(); var url_val = $('input[name="url_val_'+i+'"]').val(); if (url_val != ""){ list += url_type +'|' + url_val +';'; } } args['exclude_url'] = list; wsPost('set_site_conf','', args, function(rdata){ var rdata = $.parseJSON(rdata.data); layer.msg(rdata.msg,{icon:rdata.status?1:2}); }); } if (select_pos == 5){ var record_post_args = $('input[name="record_post_args"]').prop('checked'); var record_get_403_args = $('input[name="record_get_403_args"]').prop('checked'); args["record_post_args"] = record_post_args; args['record_get_403_args'] = record_get_403_args; wsPost('set_site_conf','', args, function(rdata){ var rdata = $.parseJSON(rdata.data); layer.msg(rdata.msg,{icon:rdata.status?1:2}); }); } }, }); }); }); }); } function wsSitesList(){ //////////////////////////////////////////////////////////////////////////////////////////////////////// var randstr = getRandomString(10); var html = '
\
\
\
\ \ \ \ \
\ \
\
\ \
\
\

总浏览量(PV)

\

0

\
\
\

总访客量(UV)

\

0

\
\
\

总IP数

\

0

\
\
\

总流量

\

0

\
\
\

总请求

\

0

\
\
\
\
'; $(".soft-man-con").html(html); $('[data-toggle="tooltip"]').tooltip(); //日期范围 laydate.render({ elem: '#time_choose', value:'', range:true, done:function(value, startDate, endDate){ if(!value){ return false; } $('#search_time button').each(function(){ $(this).removeClass('cur'); }); var timeA = value.split('-') var start = $.trim(timeA[0]+'-'+timeA[1]+'-'+timeA[2]) var end = $.trim(timeA[3]+'-'+timeA[4]+'-'+timeA[5]) query_txt = toUnixTime(start + " 00:00:00") + "-"+ toUnixTime(end + " 00:00:00") $('#time_choose').attr("data-name",query_txt); $('#time_choose').addClass("cur"); wsSitesListRequest(1); }, }); $('#time_order button:eq(0)').addClass('cur'); $('#time_order button').click(function(){ $('#time_order button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $(this).addClass('cur'); wsSitesListRequest(1); }); $('#search_time button:eq(0)').addClass('cur'); $('#search_time button').click(function(){ $('#search_time button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $('#time_choose').attr("data-name",''); $('#time_choose').removeClass("cur"); $(this).addClass('cur'); wsSitesListRequest(1); }); wsSitesListRequest(1); //////////////////////////////////////////////////////////////////////////////////////////////////////// } function wsSpiderStatLogRequest(page){ var args = {}; args['page'] = page; args['page_size'] = 10; args['site'] = $('select[name="site"]').val(); args['status_code'] = $('select[name="status_code"]').val(); var query_date = 'today'; if ($('#time_choose').attr("data-name") != ''){ query_date = $('#time_choose').attr("data-name"); } else { query_date = $('#search_time button.cur').attr("data-name"); } args['query_date'] = query_date; args['tojs'] = 'wsSpiderStatLogRequest'; wsPost('get_spider_stat_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); var list = ''; var data = rdata.data.data; if (data.length > 0){ for(i in data){ list += ''; list += '' + data[i]['time']+''; list += '' + data[i]['baidu'] +''; list += '' + data[i]['bing'] +''; list += '' + data[i]['qh360'] +''; list += '' + data[i]['google'] +''; list += '' + data[i]['bytes'] +''; list += '' + data[i]['sogou'] +''; list += '' + data[i]['soso'] +''; list += '' + data[i]['youdao'] +''; list += '' + data[i]['youdao'] +''; list += '' + data[i]['dnspod'] +''; list += '' + data[i]['yandex'] +''; list += '' + data[i]['other'] +''; list += '' + data[i]['other'] +''; list += ''; } } else{ list += '蜘蛛列表为空'; } var table = '
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\ \ '+ list +'\
日期百度必应奇虎360Google头条搜狗搜搜神马有道DNSPODYandex其他 ?操作
\
\
'; $('#ws_table').html(table); $('#wsPage').html(rdata.data.page); $('[data-toggle="tooltip"]').tooltip(); var sumData = rdata.data.sum_data; var percent = ((sumData.spider/sumData.reqest_total)*100).toFixed(); $('#spider_left_total .request_spider').text(sumData.spider+"("+percent+"%)"); $('#spider_left_total .request_total').text(sumData.reqest_total); // 图形化 var initData = rdata.data.stat_list; var colorList = ['#6ec71e','#4885FF']; var source_name = {baidu:'百度',google:'Google',bytes:'头条',soso:'搜搜',bing:'必应',qh360:'奇虎360',youdao:'有道',yandex:'Yandex',dnspod:'DNSPOD',mpcrawler:'mpcrawler',other:'其他',}; var lenend2_obj = {}; var rightEc = echarts.init(document.getElementById('echart_right_total')); var xAxixName = $('#search_time button.cur').text(); var is_compare = false; var lenend = []; var serData = []; for(var i = 0;i (is_compare?2:4)) { lenend2_obj[lenend[i]] = false; } else { lenend2_obj[lenend[i]] = true; } } var rightOption = { backgroundColor:'#fff', tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' , textStyle: { color: '#fff', fontSize: '26' }, } }, legend: { top:'0%', data: lenend, selected:lenend2_obj, textStyle:{ fontSize:12, color:'#808080' }, icon:'rect' }, grid: { top:60, left:60, right:0, bottom:50 }, xAxis: [{ type: 'category', axisLabel:{ color:'#4D4D4D', fontSize:14, fontWeight:'bold' }, data: [xAxixName], }], color:['#4fa8f9', '#6ec71e', '#f56e6a', '#fc8b40', '#818af8', '#31c9d7', '#f35e7a', '#ab7aee', '#14d68b', '#cde5ff'], yAxis: [{ type: 'value', axisLine: { show: false, }, axisTick: { show: false }, splitNumber:4, //y轴分割线数量 axisLabel:{ color:'#8C8C8C' }, splitLine:{ lineStyle:{ type:'dashed' } } }], series: serData } rightEc.setOption(rightOption); var oop = lenend.slice(0, (is_compare?3:5)); rightEc.on('legendselectchanged', function (params) { var legend_option = this.getOption(),newAxisName = []; $.each(legend_option['xAxis'][0]['data'],function(index,item){ newAxisName.push(item.replace(/\([^\)]*\)/g,"")) }) legend_option['xAxis'][0]['data'] = newAxisName; var num = 0; for(var e in params.selected){ if(params.selected.hasOwnProperty(e)){ params.selected[e]? num++ : ''; } } if(num > (is_compare?3:5)){ oop.push(params.name) } if (num > (is_compare?3:5)) { var hah = oop.slice(oop.length - (is_compare?4:6), oop.length - (is_compare?3:4))[0] + ''; legend_option.legend[0].selected[hah] = false; } if (num < 1){ legend_option.legend[0].selected[params.name] = true; } this.setOption(legend_option); }); }); } function wsSpiderStat(){ //////////////////////////////////////////////////////////////////////////////////////////////////////// var randstr = getRandomString(10); var html = '
\
\ 网站: \ \ 时间: \
\
\ \ \ \ \
\ \
\
\
\
\

总蜘蛛

0

\

总请求

0

\
\
\
\
\
'; $(".soft-man-con").html(html); //日期范围 laydate.render({ elem: '#time_choose', value:'', range:true, done:function(value, startDate, endDate){ if(!value){ return false; } $('#search_time button').each(function(){ $(this).removeClass('cur'); }); var timeA = value.split('-') var start = $.trim(timeA[0]+'-'+timeA[1]+'-'+timeA[2]) var end = $.trim(timeA[3]+'-'+timeA[4]+'-'+timeA[5]) query_txt = toUnixTime(start + " 00:00:00") + "-"+ toUnixTime(end + " 00:00:00") $('#time_choose').attr("data-name",query_txt); $('#time_choose').addClass("cur"); wsSpiderStatLogRequest(1); }, }); $('#search_time button:eq(0)').addClass('cur'); $('#search_time button').click(function(){ $('#search_time button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $('#time_choose').attr("data-name",''); $('#time_choose').removeClass("cur"); $(this).addClass('cur'); wsSpiderStatLogRequest(1); }); $('select[name="status_code"]').change(function(){ wsSpiderStatLogRequest(1); }); wsPost('get_default_site','',{},function(rdata){ $('select[name="site"]').html(''); var rdata = $.parseJSON(rdata.data); var rdata = rdata.data; var default_site = rdata["default"]; var select = ''; for (var i = 0; i < rdata["list"].length; i++) { if (default_site == rdata["list"][i]){ select += ''; } else{ select += ''; } } $('select[name="site"]').html(select); wsSpiderStatLogRequest(1); $('select[name="site"]').change(function(){ wsSpiderStatLogRequest(1); }); }); //////////////////////////////////////////////////////////////////////////////////////////////////////// } function wsClientStatLogRequest(page){ var args = {}; args['page'] = page; args['page_size'] = 10; args['site'] = $('select[name="site"]').val(); args['status_code'] = $('select[name="status_code"]').val(); var query_date = 'today'; if ($('#time_choose').attr("data-name") != ''){ query_date = $('#time_choose').attr("data-name"); } else { query_date = $('#search_time button.cur').attr("data-name"); } args['query_date'] = query_date; args['tojs'] = 'wsClientStatLogRequest'; wsPost('get_client_stat_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); var list = ''; var data = rdata.data.data; if (data.length > 0){ for(i in data){ list += ''; list += '' + data[i]['time']+''; list += '' + data[i]['android'] +''; list += '' + data[i]['iphone'] +''; list += '' + data[i]['windows'] +''; list += '' + data[i]['chrome'] +''; list += '' + data[i]['weixin'] +''; list += '' + data[i]['qh360'] +''; list += '' + data[i]['edeg'] +''; list += '' + data[i]['firefox'] +''; list += '' + data[i]['safari'] +''; list += '' + data[i]['mac'] +''; list += '' + data[i]['msie'] +''; list += '' + data[i]['machine'] +''; list += '' + data[i]['other'] +''; list += ''; } } else{ list += '客服端列表为空'; } var table = '
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\ \ '+ list +'\
日期安桌iOSWindowsChrome微信360Edge火狐SafariMacIE机器 ?其他
\
\
'; $('#ws_table').html(table); $('#wsPage').html(rdata.data.page); $('[data-toggle="tooltip"]').tooltip(); // 图形化 var initData = rdata.data.stat_list; var sumData = rdata.data.sum_data; var colorList = ['#6ec71e','#4885FF']; var source_name = {android:'安卓',iphone:'iOS',windows:'Windows',chrome:'Chrome',weixin:'微信',qh360:'360',edeg:'Edge',firefox:'火狐',safari:'Safari',mac:'Mac',linux:'Linux',msie:'IE',metasr:'搜狗',theworld:'世界之窗',tt:'腾讯TT',maxthon:'遨游',opera:'Opera',qq:'QQ浏览器',uc:'UC',pc2345:'2345',other:'其他',machine:'Machine'}; var lenend2_obj = {}; var leftEc = echarts.init(document.getElementById('echart_left_total')); var rightEc = echarts.init(document.getElementById('echart_right_total')); var datas = [ { value: sumData.pc, name: 'PC客服端' }, { value: sumData.mobile, name: '移动客服端' }, ]; var leftOption = { backgroundColor:'#fff', title: { text: sumData.reqest_total, textStyle: { color: '#484848', fontSize: 17 }, subtext: '总请求数', subtextStyle: { color: '#717171', fontSize: 15 }, itemGap: 20, left: 'center', top: '42%' }, tooltip: { trigger: 'item' }, series: [{ type: 'pie', radius: ['45%', '55%'], center: ["50%", "50%"], clockwise: true, avoidLabelOverlap: false, hoverOffset: 15, itemStyle: { normal: { label: { show: true, position: 'outside', color: '#666', formatter: function(params) { var percent = 0; var total = 0; for (var i = 0; i < datas.length; i++) { total += datas[i].value; } if(params.name !== '') { return params.name + '\n' + '\n' + params.value + '/次'; }else { return ''; } }, }, labelLine: { length: 20, length2: 10 }, color: function(params) { return colorList[params.dataIndex] } } }, data: datas },{ itemStyle: { normal: { color: '#F5F6FA', } }, type: 'pie', hoverAnimation: false, radius: ['42%', '58%'], center: ["50%", "50%"], label: { normal: { show:false, } }, data: [], z:-1 }] } leftEc.setOption(leftOption); var xAxixName = $('#search_time button.cur').text(); var is_compare = false; var lenend = []; var serData = []; for(var i = 0;i (is_compare?2:4)) { lenend2_obj[lenend[i]] = false; } else { lenend2_obj[lenend[i]] = true; } } var rightOption = { backgroundColor:'#fff', tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' , textStyle: { color: '#fff', fontSize: '26' }, } }, legend: { top:'0%', data: lenend, selected:lenend2_obj, textStyle:{ fontSize:12, color:'#808080' }, icon:'rect' }, grid: { top:60, left:60, right:0, bottom:50 }, xAxis: [{ type: 'category', axisLabel:{ color:'#4D4D4D', fontSize:14, fontWeight:'bold' }, data: [xAxixName], }], color:['#4fa8f9', '#6ec71e', '#f56e6a', '#fc8b40', '#818af8', '#31c9d7', '#f35e7a', '#ab7aee', '#14d68b', '#cde5ff'], yAxis: [{ type: 'value', axisLine: { show: false, }, axisTick: { show: false }, splitNumber:4, //y轴分割线数量 axisLabel:{ color:'#8C8C8C' }, splitLine:{ lineStyle:{ type:'dashed' } } }], series: serData } rightEc.setOption(rightOption); var oop = lenend.slice(0, (is_compare?3:5)); rightEc.on('legendselectchanged', function (params) { var legend_option = this.getOption(),newAxisName = []; $.each(legend_option['xAxis'][0]['data'],function(index,item){ newAxisName.push(item.replace(/\([^\)]*\)/g,"")) }) legend_option['xAxis'][0]['data'] = newAxisName; var num = 0; for(var e in params.selected){ if(params.selected.hasOwnProperty(e)){ params.selected[e]? num++ : ''; } } if(num > (is_compare?3:5)){ oop.push(params.name) } if (num > (is_compare?3:5)) { var hah = oop.slice(oop.length - (is_compare?4:6), oop.length - (is_compare?3:4))[0] + ''; legend_option.legend[0].selected[hah] = false; } if (num < 1){ legend_option.legend[0].selected[params.name] = true; } this.setOption(legend_option) }); }); } function wsClientStat(){ //////////////////////////////////////////////////////////////////////////////////////////////////////// var randstr = getRandomString(10); var html = '
\
\ 网站: \ \ 时间: \
\
\ \ \ \ \
\ \
\
\
\
\
\
\
\
'; $(".soft-man-con").html(html); //日期范围 laydate.render({ elem: '#time_choose', value:'', range:true, done:function(value, startDate, endDate){ if(!value){ return false; } $('#search_time button').each(function(){ $(this).removeClass('cur'); }); var timeA = value.split('-') var start = $.trim(timeA[0]+'-'+timeA[1]+'-'+timeA[2]) var end = $.trim(timeA[3]+'-'+timeA[4]+'-'+timeA[5]) query_txt = toUnixTime(start + " 00:00:00") + "-"+ toUnixTime(end + " 00:00:00") $('#time_choose').attr("data-name",query_txt); $('#time_choose').addClass("cur"); wsClientStatLogRequest(1); }, }); $('#search_time button:eq(0)').addClass('cur'); $('#search_time button').click(function(){ $('#search_time button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $('#time_choose').attr("data-name",''); $('#time_choose').removeClass("cur"); $(this).addClass('cur'); wsClientStatLogRequest(1); }); $('select[name="status_code"]').change(function(){ wsClientStatLogRequest(1); }); wsPost('get_default_site','',{},function(rdata){ $('select[name="site"]').html(''); var rdata = $.parseJSON(rdata.data); var rdata = rdata.data; var default_site = rdata["default"]; var select = ''; for (var i = 0; i < rdata["list"].length; i++) { if (default_site == rdata["list"][i]){ select += ''; } else{ select += ''; } } $('select[name="site"]').html(select); wsClientStatLogRequest(1); $('select[name="site"]').change(function(){ wsClientStatLogRequest(1); }); }); //////////////////////////////////////////////////////////////////////////////////////////////////////// } function wsIpStatLogRequest(page){ var args = {} args['site'] = $('select[name="site"]').val(); var query_date = 'today'; query_date = $('#search_time button.cur').attr("data-name"); args['query_date'] = query_date; args['tojs'] = 'wsIpStatLogRequest'; wsPost('get_ip_stat_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); var list = ''; var data = rdata.data; // console.log(rdata,data); if (data.length > 0){ for(i in data){ list += ''; list += '' + (parseInt(i)+1)+''; list += '' + data[i]['ip']+''; list += '' + data[i]['area'] +''; list += '' + data[i]['day'] +'('+data[i]['day_rate']+'%)'; list += '' + toSize(data[i]['flow']) +'('+data[i]['flow_rate']+'%)'; list += '' +''; list += ''; } } else{ list += 'IP列表为空'; } var table = '
\ \ \ \ \ \ \ \ \ \ \ '+ list +'\
序号IP归属地(仅供参考)请求数流量流量占比图
\
\
'; $('#ws_table').html(table); }); } function wsIpStat(){ //////////////////////////////////////////////////////////////////////////////////////////////////////// var randstr = getRandomString(10); var html = '
\
\ 网站: \ \ 时间: \
\
\ \ \ \ \
\
\
\
\
'; $(".soft-man-con").html(html); $('#search_time button:eq(0)').addClass('cur'); $('#search_time button').click(function(){ $('#search_time button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $('#time_choose').attr("data-name",''); $('#time_choose').removeClass("cur"); $(this).addClass('cur'); wsIpStatLogRequest(1); }); wsPost('get_default_site','',{},function(rdata){ $('select[name="site"]').html(''); var rdata = $.parseJSON(rdata.data); var rdata = rdata.data; var default_site = rdata["default"]; var select = ''; for (var i = 0; i < rdata["list"].length; i++) { if (default_site == rdata["list"][i]){ select += ''; } else{ select += ''; } } $('select[name="site"]').html(select); wsIpStatLogRequest(1); $('select[name="site"]').change(function(){ wsIpStatLogRequest(1); }); }); //////////////////////////////////////////////////////////////////////////////////////////////////////// } function wsUriStatLogRequest(page){ var args = {} args['site'] = $('select[name="site"]').val(); var query_date = 'today'; query_date = $('#search_time button.cur').attr("data-name"); args['query_date'] = query_date; args['tojs'] = 'wsUriStatLogRequest'; wsPost('get_uri_stat_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); var list = ''; var data = rdata.data; // console.log(rdata,data); if (data.length > 0){ for(i in data){ list += ''; list += '' + (parseInt(i)+1)+''; list += '' + data[i]['uri']+''; list += '' + data[i]['day'] +'('+data[i]['day_rate']+'%)'; list += '' + toSize(data[i]['flow']) +'('+data[i]['flow_rate']+'%)'; list += '' +''; list += ''; } } else{ list += 'URI列表为空'; } var table = '
\ \ \ \ \ \ \ \ \ \ '+ list +'\
序号URI请求数流量流量占比图
\
\
'; $('#ws_table').html(table); }); } function wsUriStat(){ //////////////////////////////////////////////////////////////////////////////////////////////////////// var randstr = getRandomString(10); var html = '
\
\ 网站: \ \ 时间: \
\
\ \ \ \ \
\
\
\
\
'; $(".soft-man-con").html(html); $('#search_time button:eq(0)').addClass('cur'); $('#search_time button').click(function(){ $('#search_time button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $('#time_choose').attr("data-name",''); $('#time_choose').removeClass("cur"); $(this).addClass('cur'); wsUriStatLogRequest(1); }); wsPost('get_default_site','',{},function(rdata){ $('select[name="site"]').html(''); var rdata = $.parseJSON(rdata.data); var rdata = rdata.data; var default_site = rdata["default"]; var select = ''; for (var i = 0; i < rdata["list"].length; i++) { if (default_site == rdata["list"][i]){ select += ''; } else{ select += ''; } } $('select[name="site"]').html(select); wsUriStatLogRequest(1); $('select[name="site"]').change(function(){ wsUriStatLogRequest(1); }); }); //////////////////////////////////////////////////////////////////////////////////////////////////////// } function wsTableErrorLogRequest(page){ var args = {}; args['page'] = page; args['page_size'] = 10; args['site'] = $('select[name="site"]').val(); args['status_code'] = $('select[name="status_code"]').val(); var query_date = 'today'; if ($('#time_choose').attr("data-name") != ''){ query_date = $('#time_choose').attr("data-name"); } else { query_date = $('#search_time button.cur').attr("data-name"); } args['query_date'] = query_date; args['tojs'] = 'wsTableErrorLogRequest'; wsPost('get_logs_error_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); var list = ''; var data = rdata.data.data; if (data.length > 0){ for(i in data){ list += ''; list += '' + getLocalTime(data[i]['time'])+''; list += '' + data[i]['domain'] +''; list += '' + data[i]['ip'] +''; list += '' + toSize(data[i]['body_length']) +''; list += '' + toSecond(data[i]['request_time']) +''; list += '' + data[i]['uri'] +''; list += '' + data[i]['status_code']+'/' + data[i]['method'] +''; list += '详情'; list += ''; } } else{ list += '错误日志为空'; } var table = '
\ \ \ \ \ \ \ \ \ \ \ \ '+ list +'\
时间域名IP响应耗时URL状态/类型操作
\
\
'; $('#ws_table').html(table); $('#wsPage').html(rdata.data.page); $(".tablescroll .details").click(function(){ var index = $(this).attr('data-id'); var res = data[index]; layer.open({ type: 1, title: "【"+res.domain + "】详情信息", area: '600px', closeBtn: 2, shadeClose: false, content: '
\
\ \ \ \\
时间' + getLocalTime(res.time) + '真实IP' + res.ip + '客户端端口'+(res.client_port>0 && res.client_port != ''?res.client_port:'')+'
类型' + res.method + '状态' + res.status_code + '响应大小' + toSize(res.body_length) + '
\
协议
\
' + res.protocol + '
\
URL
\
' + $('
').text(res.uri).html() + '
\
完整IP列表
\
' + $('
').text(res.ip_list).html() + '
\
来路
\
' + $('
').text(res.referer == null ?'None':res.referer).html() + '
\
User-Agent
\
' + $('
').text(res.user_agent).html() + '
\
处理耗时
\
' +res.request_time + ' ms
\
', }); }); }); } function wsSitesErrorLog(){ //////////////////////////////////////////////////////////////////////////////////////////////////////// var randstr = getRandomString(10); var html = '
\
\ 网站: \ \ 状态码: \ \ 时间: \
\
\ \ \ \ \
\ \
\
\
\
'; $(".soft-man-con").html(html); //日期范围 laydate.render({ elem: '#time_choose', value:'', range:true, done:function(value, startDate, endDate){ if(!value){ return false; } $('#search_time button').each(function(){ $(this).removeClass('cur'); }); var timeA = value.split('-') var start = $.trim(timeA[0]+'-'+timeA[1]+'-'+timeA[2]) var end = $.trim(timeA[3]+'-'+timeA[4]+'-'+timeA[5]) query_txt = toUnixTime(start + " 00:00:00") + "-"+ toUnixTime(end + " 00:00:00") $('#time_choose').attr("data-name",query_txt); $('#time_choose').addClass("cur"); wsTableErrorLogRequest(1); }, }); $('#search_time button:eq(0)').addClass('cur'); $('#search_time button').click(function(){ $('#search_time button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $('#time_choose').attr("data-name",''); $('#time_choose').removeClass("cur"); $(this).addClass('cur'); wsTableErrorLogRequest(1); }); $('select[name="status_code"]').change(function(){ wsTableErrorLogRequest(1); }); wsPost('get_default_site','',{},function(rdata){ $('select[name="site"]').html(''); var rdata = $.parseJSON(rdata.data); var rdata = rdata.data; var default_site = rdata["default"]; var select = ''; for (var i = 0; i < rdata["list"].length; i++) { if (default_site == rdata["list"][i]){ select += ''; } else{ select += ''; } } $('select[name="site"]').html(select); wsTableErrorLogRequest(1); $('select[name="site"]').change(function(){ wsTableErrorLogRequest(1); }); }); //////////////////////////////////////////////////////////////////////////////////////////////////////// } function wsTableLogRequest(page){ var args = {}; args['page'] = page; args['page_size'] = 10; args['site'] = $('select[name="site"]').val(); args['method'] = $('select[name="method"]').val(); args['status_code'] = $('select[name="status_code"]').val(); args['spider_type'] = $('select[name="spider_type"]').val(); var query_date = 'today'; if ($('#time_choose').attr("data-name") != ''){ query_date = $('#time_choose').attr("data-name"); } else { query_date = $('#search_time button.cur').attr("data-name"); } args['query_date'] = query_date; // console.log("query_date:",query_date); var search_uri = $('input[name="search_uri"]').val(); args['search_uri'] = search_uri; args['tojs'] = 'wsTableLogRequest'; wsPost('get_logs_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); var list = ''; var data = rdata.data.data; if (data.length > 0){ for(i in data){ list += ''; list += '' + getLocalTime(data[i]['time'])+''; list += '' + data[i]['domain'] +''; list += '' + data[i]['ip'] +''; list += '' + toSize(data[i]['body_length']) +''; list += '' + toSecond(data[i]['request_time']) +''; list += '' + data[i]['uri'] +''; list += '' + data[i]['status_code']+'/' + data[i]['method'] +''; list += '详情'; list += ''; } } else{ list += '网站日志为空'; } var table = '
\ \ \ \ \ \ \ \ \ \ \ \ '+ list +'\
时间域名IP响应耗时URL状态/类型操作
\
\
'; $('#ws_table').html(table); $('#wsPage').html(rdata.data.page); $(".tablescroll .details").click(function(){ var index = $(this).attr('data-id'); var res = data[index]; layer.open({ type: 1, title: "【"+res.domain + "】详情信息", area: '600px', closeBtn: 2, shadeClose: false, content: '
\
\ \ \ \\
时间' + getLocalTime(res.time) + '真实IP' + res.ip + '客户端端口'+(res.client_port>0 && res.client_port != ''?res.client_port:'')+'
类型' + res.method + '状态' + res.status_code + '响应大小' + toSize(res.body_length) + '
\
协议
\
' + res.protocol + '
\
URL
\
' + $('
').text(res.uri).html() + '
\
完整IP列表
\
' + $('
').text(res.ip_list).html() + '
\
来路
\
' + $('
').text(res.referer == null ?'None':res.referer).html() + '
\
User-Agent
\
' + $('
').text(res.user_agent).html() + '
\
处理耗时
\
' +res.request_time + ' ms
\
', }); }); }); } function wsSitesLog(){ //////////////////////////////////////////////////////////////////////////////////////////////////////// var randstr = getRandomString(10); var html = '
\
\ 网站: \ \ 时间: \
\
\ \ \ \ \
\ \
\
\
\ 请求类型: \ \ 状态码: \ \ 蜘蛛过滤: \ \ URL过滤: \
\ \
\ \
\
\
\
\
'; $(".soft-man-con").html(html); //日期范围 laydate.render({ elem: '#time_choose', value:'', range:true, done:function(value, startDate, endDate){ if(!value){ return false; } $('#search_time button').each(function(){ $(this).removeClass('cur'); }); var timeA = value.split('-') var start = $.trim(timeA[0]+'-'+timeA[1]+'-'+timeA[2]) var end = $.trim(timeA[3]+'-'+timeA[4]+'-'+timeA[5]) query_txt = toUnixTime(start + " 00:00:00") + "-"+ toUnixTime(end + " 00:00:00") $('#time_choose').attr("data-name",query_txt); $('#time_choose').addClass("cur"); wsTableLogRequest(1); }, }); $('#search_time button:eq(0)').addClass('cur'); $('#search_time button').click(function(){ $('#search_time button').each(function(){ if ($(this).hasClass('cur')){ $(this).removeClass('cur'); } }); $('#time_choose').attr("data-name",''); $('#time_choose').removeClass("cur"); $(this).addClass('cur'); wsTableLogRequest(1); }); $('select[name="method"]').change(function(){ wsTableLogRequest(1); }); $('select[name="status_code"]').change(function(){ wsTableLogRequest(1); }); $('select[name="spider_type"]').change(function(){ wsTableLogRequest(1); }); $('#logs_search').click(function(){ wsTableLogRequest(1); }); wsPost('get_default_site','',{},function(rdata){ $('select[name="site"]').html(''); var rdata = $.parseJSON(rdata.data); var rdata = rdata.data; var default_site = rdata["default"]; var select = ''; for (var i = 0; i < rdata["list"].length; i++) { if (default_site == rdata["list"][i]){ select += ''; } else{ select += ''; } } $('select[name="site"]').html(select); wsTableLogRequest(1); $('select[name="site"]').change(function(){ wsTableLogRequest(1); }); }); //////////////////////////////////////////////////////////////////////////////////////////////////////// }