网站统计 x10

This commit is contained in:
midoks
2022-07-24 00:45:24 +08:00
parent 79fdadc7f3
commit e70c5bbc13
4 changed files with 864 additions and 114 deletions
+39 -22
View File
@@ -17,10 +17,47 @@
color: #fff;
}
.divpre {
padding: 9.5px;
margin: 0 0 10px;
font-size: 13px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: #f6f6f6;
border: 1px solid #ddd;
border-radius: 4px;
max-height: 100px;
overflow: auto;
}
.form-control{
border-radius: 0px;
}
.ws_tips {
color: #777;
margin-left: -10px;
vertical-align: middle;
}
.tips {
border: 1px solid #cbcbcb;
border-radius: 8px;
color: #cbcbcb;
cursor: pointer;
display: inline-block;
font-family: arial;
font-size: 12px;
font-style: normal;
height: 14px;
line-height: 14px;
margin-left: 5px;
text-align: center;
width: 14px;
}
.ws_setting .ws_title {
display: inline-block;
width: 100px;
@@ -44,12 +81,6 @@
height: 26px;
}
.ws_setting .ws_content .ws_tips {
color: #777;
margin-left: -10px;
vertical-align: middle;
}
.ws_setting .tab-nav {
margin-bottom: 10px;
}
@@ -63,21 +94,6 @@
resize: none;
}
.ws_setting .ws_content .tips {
border: 1px solid #cbcbcb;
border-radius: 8px;
color: #cbcbcb;
cursor: pointer;
display: inline-block;
font-family: arial;
font-size: 12px;
font-style: normal;
height: 14px;
line-height: 14px;
margin-left: 5px;
text-align: center;
width: 14px;
}
.ws_setting .ws_content .item-line {
display: block;
@@ -98,7 +114,8 @@
<div class="bt-w-menu">
<p class="bgw" onclick="pluginService('webstats');">服务</p>
<p onclick="wsOverview();">概览</p>
<p onclick="wsSitesErrorLog();">错误日志</p>
<p onclick="wsClientStat();">客服端统计</p>
<p onclick="wsSitesErrorLog();">错误日志</p>
<p onclick="wsSitesLog();">网站日志</p>
<p onclick="wsGlobalSetting();">全局设置</p>
</div>
+193 -1
View File
@@ -329,7 +329,7 @@ def getLogsList():
limit = str(page_size) + ' offset ' + str(page_size * (page - 1))
conn = pSqliteDb('web_logs', domain)
field = 'time,ip,domain,server_name,method,status_code,request_time,uri,body_length'
field = 'time,ip,domain,server_name,method,protocol,status_code,request_headers,ip_list,client_port,body_length,user_agent,referer,request_time,uri,body_length'
condition = ''
conn = conn.field(field)
conn = conn.where("1=1", ())
@@ -384,6 +384,193 @@ def getLogsList():
return mw.returnJson(True, 'ok', data)
def getLogsErrorList():
args = getArgs()
check = checkArgs(args, ['page', 'page_size',
'site', 'status_code', 'query_date'])
if not check[0]:
return check[1]
page = int(args['page'])
page_size = int(args['page_size'])
domain = args['site']
tojs = args['tojs']
status_code = args['status_code']
query_date = args['query_date']
setDefaultSite(domain)
limit = str(page_size) + ' offset ' + str(page_size * (page - 1))
conn = pSqliteDb('web_logs', domain)
field = 'time,ip,domain,server_name,method,protocol,status_code,request_headers,ip_list,client_port,body_length,user_agent,referer,request_time,uri,body_length'
conn = conn.field(field)
conn = conn.where("1=1", ())
if status_code != "all":
if status_code.find("x") > -1:
status_code = status_code.replace("x", "%")
conn = conn.andWhere("status_code like ?", (status_code,))
else:
conn = conn.andWhere("status_code=?", (status_code,))
else:
conn = conn.andWhere(
"(status_code like '50%' or status_code like '40%')", ())
todayTime = time.strftime('%Y-%m-%d 00:00:00', time.localtime())
todayUt = int(time.mktime(time.strptime(todayTime, "%Y-%m-%d %H:%M:%S")))
if query_date == 'today':
conn = conn.andWhere("time>=?", (todayUt,))
elif query_date == "yesterday":
conn = conn.andWhere("time>=? and time<=?", (todayUt - 86400, todayUt))
elif query_date == "l7":
conn = conn.andWhere("time>=?", (todayUt - 7 * 86400,))
elif query_date == "l30":
conn = conn.andWhere("time>=?", (todayUt - 30 * 86400,))
else:
exlist = query_date.split("-")
conn = conn.andWhere("time>=? and time<=?", (exlist[0], exlist[1]))
clist = conn.limit(limit).order('time desc').inquiry()
count_key = "count(*) as num"
count = conn.field(count_key).limit('').order('').inquiry()
count = count[0][count_key]
data = {}
_page = {}
_page['count'] = count
_page['p'] = page
_page['row'] = page_size
_page['tojs'] = tojs
data['page'] = mw.getPage(_page)
data['data'] = clist
return mw.returnJson(True, 'ok', data)
def toSumField(sql):
l = sql.split(",")
field = ""
for x in l:
field += "sum(" + x + ") as " + x + ","
field = field.strip(',')
return field
def getClientStatList():
args = getArgs()
check = checkArgs(args, ['page', 'page_size',
'site', 'query_date'])
if not check[0]:
return check[1]
page = int(args['page'])
page_size = int(args['page_size'])
domain = args['site']
tojs = args['tojs']
query_date = args['query_date']
setDefaultSite(domain)
conn = pSqliteDb('client_stat', domain)
stat = pSqliteDb('client_stat', domain)
# 列表
limit = str(page_size) + ' offset ' + str(page_size * (page - 1))
field = 'time,weixin,android,iphone,mac,windows,linux,edeg,firefox,msie,metasr,qh360,theworld,tt,maxthon,opera,qq,uc,pc2345,safari,chrome,machine,mobile,other'
field_sum = toSumField(field.replace("time,", ""))
time_field = "substr(time,1,8),"
field_sum = time_field + field_sum
stat = stat.field(field_sum)
if query_date == "today":
todayTime = time.strftime(
'%Y%m%d00', time.localtime(time.time() - 0 * 86400))
stat.where("time >= ?", (todayTime,))
elif query_date == "yesterday":
todayTime = time.strftime(
'%Y%m%d00', time.localtime(time.time() - 1 * 86400))
stat.where("time >= ?", (todayTime,))
elif query_date == "l7":
todayTime = time.strftime(
'%Y%m%d00', time.localtime(time.time() - 7 * 86400))
stat.where("time >= ?", (todayTime,))
elif query_date == "l30":
todayTime = time.strftime(
'%Y%m%d00', time.localtime(time.time() - 30 * 86400))
stat.where("time >= ?", (todayTime,))
else:
exlist = query_date.split("-")
start = time.strftime(
'%Y%m%d00', time.localtime(int(exlist[0])))
end = time.strftime(
'%Y%m%d23', time.localtime(int(exlist[1])))
stat.where("time >= ? and time <= ? ", (start, end,))
# 图表数据
statlist = stat.group('substr(time,1,4)').inquiry(field)
if len(statlist) > 0:
del(statlist[0]['time'])
pc = 0
pc_key_list = ['chrome', 'qh360', 'edeg', 'firefox', 'safari', 'msie',
'metasr', 'theworld', 'tt', 'maxthon', 'opera', 'qq', 'pc2345']
for x in pc_key_list:
pc += statlist[0][x]
mobile = 0
mobile_key_list = ['mobile', 'android', 'iphone', 'weixin']
for x in mobile_key_list:
mobile += statlist[0][x]
reqest_total = pc + mobile
sum_data = {
"pc": pc,
"mobile": mobile,
"reqest_total": reqest_total,
}
statlist = sorted(statlist[0].items(),
key=lambda x: x[1], reverse=True)
_statlist = statlist[0:10]
__statlist = {}
statlist = []
for x in _statlist:
__statlist[x[0]] = x[1]
statlist.append(__statlist)
else:
sum_data = {
"pc": 0,
"mobile": 0,
"reqest_total": 0,
}
statlist = []
# 列表数据
conn = conn.field(field_sum)
clist = conn.group('substr(time,1,8)').limit(
limit).order('time desc').inquiry(field)
sql = "SELECT count(*) num from (\
SELECT count(*) as num FROM client_stat GROUP BY substr(time,1,8)\
)"
result = conn.query(sql, ())
result = list(result)
count = result[0][0]
data = {}
_page = {}
_page['count'] = count
_page['p'] = page
_page['row'] = page_size
_page['tojs'] = tojs
data['page'] = mw.getPage(_page)
data['data'] = clist
data['stat_list'] = statlist
data['sum_data'] = sum_data
return mw.returnJson(True, 'ok', data)
if __name__ == "__main__":
func = sys.argv[1]
if func == 'status':
@@ -406,5 +593,10 @@ if __name__ == "__main__":
print(getDefaultSite())
elif func == 'get_logs_list':
print(getLogsList())
elif func == 'get_logs_error_list':
print(getLogsErrorList())
elif func == 'get_client_stat_list':
print(getClientStatList())
else:
print('error')
+609 -82
View File
@@ -165,31 +165,443 @@ function wsOverview(){
function wsSitesErrorLog(){
function wsClientStatLogRequest(page){
var args = {};
args['page'] = 1;
args['page'] = page;
args['page_size'] = 10;
args['site'] = 'unset';
args['tojs'] = 'wsSitesErrorLog';
wsPost('get_logs_list', '' ,args, function(rdata){
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);
// console.log(rdata);
var list = '';
var data = rdata.data.data;
for(i in data){
list += '<tr>';
list += '<td>' + data[i]['time']+'</td>';
list += '<td>' + data[i]['domain'] +'</td>';
list += '<td>' + data[i]['ip'] +'</td>';
list += '<td>' + data[i]['body_length'] +'</td>';
list += '<td>' + data[i]['request_time'] +'ms</td>';
list += '<td>' + data[i]['uri'] +'</td>';
list += '<td>' + data[i]['status_code']+'/' + data[i]['method'] +'</td>';
list += '<td><a href="javascript:;" class="btlink" onclick="openPhpmyadmin()" title="详情">详情</a></td>';
list += '</tr>';
if (data.length > 0){
for(i in data){
list += '<tr>';
list += '<td>' + data[i]['time']+'</td>';
list += '<td>' + data[i]['android'] +'</td>';
list += '<td>' + data[i]['iphone'] +'</td>';
list += '<td>' + data[i]['windows'] +'</td>';
list += '<td>' + data[i]['chrome'] +'</td>';
list += '<td>' + data[i]['weixin'] +'</td>';
list += '<td>' + data[i]['qh360'] +'</td>';
list += '<td>' + data[i]['edeg'] +'</td>';
list += '<td>' + data[i]['firefox'] +'</td>';
list += '<td>' + data[i]['safari'] +'</td>';
list += '<td>' + data[i]['mac'] +'</td>';
list += '<td>' + data[i]['msie'] +'</td>';
list += '<td>' + data[i]['machine'] +'</td>';
list += '<td>' + data[i]['other'] +'</td>';
list += '</tr>';
}
} else{
list += '<tr><td colspan="8" style="text-align:center;">网站日志为空</td></tr>';
}
var table = '<div class="divtable mtb10">\
<div class="tablescroll">\
var table = '<div class="tablescroll">\
<table id="DataBody" class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
<thead><tr>\
<th>日期</th>\
<th>安桌</th>\
<th>iOS</th>\
<th>Windows</th>\
<th>Chrome</th>\
<th>微信</th>\
<th>360</th>\
<th>Edge</th>\
<th>火狐</th>\
<th>Safari</th>\
<th>Mac</th>\
<th>IE</th>\
<th>机器 <span class="tips" data-toggle="tooltip" data-placement="bottom" title="机器或者脚本应用程序访问,包括:Curl、HeadlessChrome、Bot、Wget、Spider、Crawler、Scrapy、zgrab、Python、java, ab 此类关键词">?</span></th>\
<th>其他</th>\</tr></thead>\
<tbody>\
'+ list +'\
</tbody></table>\
</div>\
<div id="wsPage" class="dataTables_paginate paging_bootstrap page"></div>';
$('#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<initData.length; i++){
for(var j in initData[i]){
source_name[j] = source_name[j]?source_name[j]:j
lenend.push(source_name[j])
serData.push({
name: source_name[j],
type: 'bar',
label:{
normal: {
show: true,
position: 'top',
formatter:function(params){
return params.data;
}
}
},
barMaxWidth:60,
data: [initData[i][j]?initData[i][j]:0]
})
}
}
for (var i = 0; i < lenend.length; i++) {
if (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 = '<div>\
<div style="padding-bottom:10px;">\
<span>网站: </span>\
<select class="bt-input-text" name="site" style="margin-left:4px;width:100px;">\
<option value="unset">未设置</option>\
</select>\
<span style="margin-left:10px">时间: </span>\
<div class="input-group" style="margin-left:10px;width:350px;display: inline-table;vertical-align: top;">\
<div id="search_time" class="input-group-btn btn-group-sm">\
<button data-name="today" type="button" class="btn btn-default">今日</button>\
<button data-name="yesterday" type="button" class="btn btn-default">昨日</button>\
<button data-name="l7" type="button" class="btn btn-default">近7天</button>\
<button data-name="l30" type="button" class="btn btn-default">近30天</button>\
</div>\
<span class="last-span"><input data-name="" type="text" id="time_choose" lay-key="1000001_'+randstr+'" class="form-control btn-group-sm" autocomplete="off" placeholder="自定义时间" style="display: inline-block;font-size: 12px;padding: 0 10px;height:30px;width: 200px;"></span>\
</div>\
</div>\
<div class="echart_container">\
<div id="echart_left_total" style="height: 280px; width: 300px;display: inline-block;position: relative;"></div>\
<div id="echart_right_total" style="height: 280px; width: 450px;display: inline-block;position: relative;"></div>\
</div>\
<div class="divtable mtb10" id="ws_table"></div>\
</div>';
$(".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 += '<option value="'+rdata["list"][i]+'" selected>'+rdata["list"][i]+'</option>';
} else{
select += '<option value="'+rdata["list"][i]+'">'+rdata["list"][i]+'</option>';
}
}
$('select[name="site"]').html(select);
wsClientStatLogRequest(1);
$('select[name="site"]').change(function(){
wsClientStatLogRequest(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 += '<tr>';
list += '<td>' + getLocalTime(data[i]['time'])+'</td>';
list += '<td>' + data[i]['domain'] +'</td>';
list += '<td>' + data[i]['ip'] +'</td>';
list += '<td>' + toSize(data[i]['body_length']) +'</td>';
list += '<td>' + data[i]['request_time'] +'ms</td>';
list += '<td><span class="overflow_hide" style="width:180px;">' + data[i]['uri'] +'</span></td>';
list += '<td>' + data[i]['status_code']+'/' + data[i]['method'] +'</td>';
list += '<td><a data-id="'+i+'" href="javascript:;" class="btlink details" title="详情">详情</a></td>';
list += '</tr>';
}
} else{
list += '<tr><td colspan="8" style="text-align:center;">网站日志为空</td></tr>';
}
var table = '<div class="tablescroll">\
<table id="DataBody" class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
<thead><tr>\
<th>时间</th>\
@@ -197,76 +609,163 @@ function wsSitesErrorLog(){
<th>IP</th>\
<th>响应</th>\
<th>耗时</th>\
<th>URL</th>\
<th >URL</th>\
<th>状态/类型</th>\
<th style="text-align:right;">操作</th></tr></thead>\
<tbody>\
'+ list +'\
</tbody></table>\
</div>\
<div id="wsPage" class="dataTables_paginate paging_bootstrap page"></div>\
</div>';
var html = '<div>\
<div style="padding-bottom:10px;">\
<span>网站: </span>\
<select class="bt-input-text" name="" style="margin-left:4px">\
<option value="0">请选择</option>\
<option value="1">1-2GB</option>\
</select>\
<span style="margin-left:10px">时间: </span>\
<div class="input-group" style="width:510px;float:right;">\
<div class="input-group-btn btn-group-sm">\
<button type="button" class="btn btn-default gt">今日</button>\
<button type="button" class="btn btn-default gt">昨日</button>\
<button type="button" class="btn btn-default gt">近7天</button>\
<button type="button" class="btn btn-default gt">近30天</button>\
</div>\
<input id="time_choose" type="text" class="form-control btn-group-sm" autocomplete="off" placeholder="自定义时间" style="font-size: 12px;padding: 0 10px;height:30px;width: 150px; background-position: 10px center;">\
</div>\
</div>\
<div style="padding-bottom:10px;">\
<span>请求类型: </span>\
<select class="bt-input-text" name="req_type" style="margin-left:4px">\
<option value="0">所有</option>\
<option value="GET">GET</option>\
<option value="POST">POST</option>\
<option value="HEAD">HEAD</option>\
<option value="PUT">PUT</option>\
<option value="DELETE">DELETE</option>\
</select>\
<span style="margin-left:10px;">状态码: </span>\
<select class="bt-input-text" name="code_type" style="margin-left:4px">\
<option value="0">所有</option>\
<option value="500">500</option>\
<option value="502">502</option>\
<option value="503">503</option>\
<option value="404">404</option>\
<option value="200">200</option>\
</select>\
<span style="margin-left:10px;">蜘蛛过滤: </span>\
<select class="bt-input-text" name="spider_type" style="margin-left:4px">\
<option value="0">不过滤</option>\
<option value="baidu">百度</option>\
</select>\
<span style="margin-left:10px;">URL过滤: </span>\
<div class="input-group" style="width:210px;float:right;">\
<input type="text" class="form-control btn-group-sm" autocomplete="off" placeholder="URI搜索" style="font-size: 12px;padding: 0 10px;height:30px;">\
<div class="input-group-btn btn-group-sm">\
<button type="button" class="btn btn-default">搜索</button>\
</div>\
</div>\
</div>\
'+table+'\
</div>';
$(".soft-man-con").html(html);
<div id="wsPage" class="dataTables_paginate paging_bootstrap page"></div>';
$('#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: '<div class="pd15 lib-box">\
<div style="height:80px;"><table class="table" style="border:#ddd 1px solid; margin-bottom:10px">\
<tbody class="site_details_tbody">\
<tr><th>时间</th><td>' + getLocalTime(res.time) + '</td><th>真实IP</th><td><span class="overflow_hide detail_ip">' + res.ip + '</span></td><th>客户端端口</th><td>'+(res.client_port>0 && res.client_port != ''?res.client_port:'')+'</td></tr>\
<tr><th>类型</th><td>' + res.method + '</td><th>状态</th><td>' + res.status_code + '</td><th>响应大小</th><td>' + toSize(res.body_length) + '</td>\</tr>\
</tbody></table></div>\
<div><b style="margin-left:10px">协议</b></div>\
<div class="lib-con mt10"><div class="divpre">' + res.protocol + '</div></div>\
<div><b style="margin-left:10px">URL</b></div>\
<div class="lib-con mt10"><div class="divpre">' + $('<div ></div>').text(res.uri).html() + '</div></div>\
<div><b style="margin-left:10px">完整IP列表</b></div>\
<div class="lib-con pull-left mt10"><div class="divpre" style="max-height: 66px;">' + $('<div ></div>').text(res.ip_list).html() + '</div></div>\
<div><b style="margin-left:10px">来路</b></div>\
<div class="lib-con mt10"><div class="divpre">' + $('<div ></div>').text(res.referer == null ?'None':res.referer).html() + '</div></div>\
<div><b style="margin-left:10px">User-Agent</b></div>\
<div class="lib-con mt10"><div class="divpre">' + $('<div ></div>').text(res.user_agent).html() + '</div></div>\
<div><b style="margin-left:10px">处理耗时</b></div>\
<div class="lib-con mt10"><div class="divpre">' +res.request_time + ' ms</div></div>\
</div>',
});
});
});
}
function wsSitesErrorLog(){
////////////////////////////////////////////////////////////////////////////////////////////////////////
var randstr = getRandomString(10);
var html = '<div>\
<div style="padding-bottom:10px;">\
<span>网站: </span>\
<select class="bt-input-text" name="site" style="margin-left:4px;width:100px;">\
<option value="unset">未设置</option>\
</select>\
<span style="margin-left:10px;">状态码: </span>\
<select class="bt-input-text" name="status_code" style="margin-left:4px">\
<option value="all">所有</option>\
<option value="50x">50x</option>\
<option value="40x">40x</option>\
<option value="500">500</option>\
<option value="501">501</option>\
<option value="502">502</option>\
<option value="503">503</option>\
<option value="403">403</option>\
<option value="404">404</option>\
</select>\
<span style="margin-left:10px">时间: </span>\
<div class="input-group" style="margin-left:10px;width:350px;display: inline-table;vertical-align: top;">\
<div id="search_time" class="input-group-btn btn-group-sm">\
<button data-name="today" type="button" class="btn btn-default">今日</button>\
<button data-name="yesterday" type="button" class="btn btn-default">昨日</button>\
<button data-name="l7" type="button" class="btn btn-default">近7天</button>\
<button data-name="l30" type="button" class="btn btn-default">近30天</button>\
</div>\
<span class="last-span"><input data-name="" type="text" id="time_choose" lay-key="1000001_'+randstr+'" class="form-control btn-group-sm" autocomplete="off" placeholder="自定义时间" style="display: inline-block;font-size: 12px;padding: 0 10px;height:30px;width: 200px;"></span>\
</div>\
</div>\
<div class="divtable mtb10" id="ws_table"></div>\
</div>';
$(".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 += '<option value="'+rdata["list"][i]+'" selected>'+rdata["list"][i]+'</option>';
} else{
select += '<option value="'+rdata["list"][i]+'">'+rdata["list"][i]+'</option>';
}
}
$('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;
@@ -292,7 +791,6 @@ function wsTableLogRequest(page){
args['tojs'] = 'wsTableLogRequest';
wsPost('get_logs_list', '' ,args, function(rdata){
var rdata = $.parseJSON(rdata.data);
console.log(rdata);
var list = '';
var data = rdata.data.data;
if (data.length > 0){
@@ -305,7 +803,7 @@ function wsTableLogRequest(page){
list += '<td>' + data[i]['request_time'] +'ms</td>';
list += '<td><span class="overflow_hide" style="width:180px;">' + data[i]['uri'] +'</span></td>';
list += '<td>' + data[i]['status_code']+'/' + data[i]['method'] +'</td>';
list += '<td><a href="javascript:;" class="btlink" onclick="openPhpmyadmin()" title="详情">详情</a></td>';
list += '<td><a data-id="'+i+'" href="javascript:;" class="btlink details" title="详情">详情</a></td>';
list += '</tr>';
}
} else{
@@ -330,6 +828,38 @@ function wsTableLogRequest(page){
<div id="wsPage" class="dataTables_paginate paging_bootstrap page"></div>';
$('#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: '<div class="pd15 lib-box">\
<div style="height:80px;"><table class="table" style="border:#ddd 1px solid; margin-bottom:10px">\
<tbody class="site_details_tbody">\
<tr><th>时间</th><td>' + getLocalTime(res.time) + '</td><th>真实IP</th><td><span class="overflow_hide detail_ip">' + res.ip + '</span></td><th>客户端端口</th><td>'+(res.client_port>0 && res.client_port != ''?res.client_port:'')+'</td></tr>\
<tr><th>类型</th><td>' + res.method + '</td><th>状态</th><td>' + res.status_code + '</td><th>响应大小</th><td>' + toSize(res.body_length) + '</td>\</tr>\
</tbody></table></div>\
<div><b style="margin-left:10px">协议</b></div>\
<div class="lib-con mt10"><div class="divpre">' + res.protocol + '</div></div>\
<div><b style="margin-left:10px">URL</b></div>\
<div class="lib-con mt10"><div class="divpre">' + $('<div ></div>').text(res.uri).html() + '</div></div>\
<div><b style="margin-left:10px">完整IP列表</b></div>\
<div class="lib-con pull-left mt10"><div class="divpre" style="max-height: 66px;">' + $('<div ></div>').text(res.ip_list).html() + '</div></div>\
<div><b style="margin-left:10px">来路</b></div>\
<div class="lib-con mt10"><div class="divpre">' + $('<div ></div>').text(res.referer == null ?'None':res.referer).html() + '</div></div>\
<div><b style="margin-left:10px">User-Agent</b></div>\
<div class="lib-con mt10"><div class="divpre">' + $('<div ></div>').text(res.user_agent).html() + '</div></div>\
<div><b style="margin-left:10px">处理耗时</b></div>\
<div class="lib-con mt10"><div class="divpre">' +res.request_time + ' ms</div></div>\
</div>',
});
});
});
}
@@ -482,9 +1012,6 @@ wsPost('get_default_site','',{},function(rdata){
});
});
////////////////////////////////////////////////////////////////////////////////////////////////////////
}