diff --git a/class/core/db.py b/class/core/db.py index b267c0268..6c401d9e3 100755 --- a/class/core/db.py +++ b/class/core/db.py @@ -128,7 +128,7 @@ class Sql(): try: sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \ self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT - # print(sql) + # print(sql, self.__OPT_PARAM) result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) data = result.fetchall() # 构造字曲系列 diff --git a/plugins/webstats/index.html b/plugins/webstats/index.html index 9ea712da2..4fbee69a8 100755 --- a/plugins/webstats/index.html +++ b/plugins/webstats/index.html @@ -36,6 +36,55 @@ border-radius: 0px; } +.overview_list{ + background-color: #FAFAFA; + border: #ddd 1px solid; + width: 100%; + font-size: 0; + color: #78797D; +} + +.overview_list .overview_box{ + width: 14.2%; + display: inline-block; + font-size: 12px; + padding: 15px 0 15px 15px; + vertical-align: top; +} +.overview_list .ov_num{ + font-size: 20px; + margin-top: 7px; + color: #333; +} + +.indicators { + margin-top: 15px; + position: relative; +} + +.indicators-container { + padding: 5px; +} + +.indicators-container>span { + color: #787a7d; + margin-right: 10px; +} + +.indicators-label { + display: inline-block; + width: 95px; + height: 26px; + line-height: 26px; + cursor: pointer; +} + +.indicators-label input { + height: 13px; + margin: 0 5px 0 0; + vertical-align: -2px; +} + .ws_tips { color: #777; margin-left: -10px; @@ -130,6 +179,7 @@

服务

概览

+

网站列表

蜘蛛统计

客服端统计

错误日志

diff --git a/plugins/webstats/index.py b/plugins/webstats/index.py index 8c7ac5f68..58aab53d4 100755 --- a/plugins/webstats/index.py +++ b/plugins/webstats/index.py @@ -313,6 +313,78 @@ def setDefaultSite(name): return mw.returnJson(True, 'OK') +def toSumField(sql): + l = sql.split(",") + field = "" + for x in l: + field += "sum(" + x + ") as " + x + "," + field = field.strip(',') + return field + + +def getOverviewList(): + args = getArgs() + check = checkArgs(args, ['site', 'query_date', 'order']) + if not check[0]: + return check[1] + + domain = args['site'] + query_date = args['query_date'] + order = args['order'] + + setDefaultSite(domain) + conn = pSqliteDb('request_stat', domain) + conn = conn.where("1=1", ()) + + field = 'time,req,pv,uv,ip,length' + field_sum = toSumField(field.replace("time,", "")) + + time_field = "substr(time,1,8)," + if order == "hour": + time_field = "substr(time,9,10)," + + field_sum = time_field + field_sum + conn = conn.field(field_sum) + if query_date == "today": + todayTime = time.strftime( + '%Y%m%d00', time.localtime(time.time() - 0 * 86400)) + conn.andWhere("time >= ?", (todayTime,)) + elif query_date == "yesterday": + startTime = time.strftime( + '%Y%m%d00', time.localtime(time.time() - 1 * 86400)) + endTime = time.strftime( + '%Y%m%d00', time.localtime(time.time())) + conn.andWhere("time>=? and time<=?", (startTime, endTime)) + elif query_date == "l7": + todayTime = time.strftime( + '%Y%m%d00', time.localtime(time.time() - 7 * 86400)) + conn.andWhere("time >= ?", (todayTime,)) + elif query_date == "l30": + todayTime = time.strftime( + '%Y%m%d00', time.localtime(time.time() - 30 * 86400)) + conn.andWhere("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]))) + conn.andWhere("time >= ? and time <= ? ", (start, end,)) + + # 统计总数 + stat_list = conn.inquiry(field) + del(stat_list[0]['time']) + + # 分组统计 + dlist = conn.group(time_field.strip(",")).inquiry(field) + + data = {} + data['data'] = dlist + data['stat_list'] = stat_list[0] + + return mw.returnJson(True, 'ok', data) + + def getLogsList(): args = getArgs() check = checkArgs(args, ['page', 'page_size', @@ -452,15 +524,6 @@ def getLogsErrorList(): 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', @@ -491,9 +554,11 @@ def getClientStatList(): '%Y%m%d00', time.localtime(time.time() - 0 * 86400)) stat.where("time >= ?", (todayTime,)) elif query_date == "yesterday": - todayTime = time.strftime( + startTime = time.strftime( '%Y%m%d00', time.localtime(time.time() - 1 * 86400)) - stat.where("time >= ?", (todayTime,)) + endTime = time.strftime( + '%Y%m%d00', time.localtime(time.time())) + stat.where("time>=? and time<=?", (startTime, endTime)) elif query_date == "l7": todayTime = time.strftime( '%Y%m%d00', time.localtime(time.time() - 7 * 86400)) @@ -632,9 +697,11 @@ def getSpiderStatList(): '%Y%m%d00', time.localtime(time.time() - 0 * 86400)) stat.where("time >= ?", (todayTime,)) elif query_date == "yesterday": - todayTime = time.strftime( + startTime = time.strftime( '%Y%m%d00', time.localtime(time.time() - 1 * 86400)) - stat.where("time >= ?", (todayTime,)) + endTime = time.strftime( + '%Y%m%d00', time.localtime(time.time())) + stat.where("time>=? and time<=?", (startTime, endTime)) elif query_date == "l7": todayTime = time.strftime( '%Y%m%d00', time.localtime(time.time() - 7 * 86400)) @@ -719,6 +786,8 @@ if __name__ == "__main__": print(setGlobalConf()) elif func == 'get_default_site': print(getDefaultSite()) + elif func == 'get_overview_list': + print(getOverviewList()) elif func == 'get_logs_list': print(getLogsList()) elif func == 'get_logs_error_list': diff --git a/plugins/webstats/js/stats.js b/plugins/webstats/js/stats.js index 95c7f10e1..94f49a50f 100644 --- a/plugins/webstats/js/stats.js +++ b/plugins/webstats/js/stats.js @@ -64,106 +64,309 @@ function wsPostCallbak(method, version, args,callback){ } -function wsOverview(){ - var args = {}; - args['page'] = 1; - args['page_size'] = 10; - args['site'] = 'unset'; - args['tojs'] = 'wsOverview'; - wsPost('get_logs_list', '' ,args, function(rdata){ +function wsOverviewRequest(page){ + + 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(select_option); + + wsPost('get_overview_list', '' ,args, function(rdata){ var rdata = $.parseJSON(rdata.data); - console.log(rdata); var list = ''; var data = rdata.data.data; - for(i in data){ - list += ''; - list += '' + data[i]['time']+''; - list += '' + data[i]['domain'] +''; - list += '' + data[i]['ip'] +''; - list += '' + data[i]['body_length'] +''; - list += '' + data[i]['request_time'] +'ms'; - list += '' + data[i]['uri'] +''; - list += '' + data[i]['status_code']+'/' + data[i]['method'] +''; - list += '详情'; - list += ''; + var statData = rdata.data.stat_list; + + console.log(statData, data); + + $('.overview_list .overview_box:eq(0) .ov_num').text(statData['pv']); + $('.overview_list .overview_box:eq(1) .ov_num').text(statData['uv']); + $('.overview_list .overview_box:eq(2) .ov_num').text(statData['ip']); + $('.overview_list .overview_box:eq(3) .ov_num').text(toSize(statData['length'])); + $('.overview_list .overview_box:eq(4) .ov_num').text(statData['req']); + + var list = []; + for (var i = 0; i < data.length; i++) { + list.push(data[i][select_option]); } - var table = '
\ -
\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - '+ list +'\ -
时间域名IP响应耗时URL状态/类型操作
\ + + console.log("list",list); + + var chat = {}; + + + var chatSeriesVal = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14','15', '16', '17', '18', '19', '20', '21', '22', '23']; + chat['seriesData'] = { + data : chatSeriesVal, + type: 'line', + areaStyle: {} + } + + + + var statEc = echarts.init(document.getElementById('total_num_echart')); + var option = { + backgroundColor:'#fff', + + legend:{ + data:chat['xAxisData'], + left:'center', + top:'94%', + }, + grid: { + bottom: '9%', + containLabel: true, + x: 20, + y: 20, + x2: 20, + y2: 20 + }, + xAxis:{ + type: 'category', + boundaryGap: false, + axisTick: { + alignWithLabel: true + }, + axisLabel: { + interval: 1, + }, + data: [], + }, + yAxis: [], + graphic:[{ + type: 'group', + right: 420, + top: 50, + z: 100, + children: [{ + type: 'text', + left: 'center', + top: 'center', + z: 100, + style: { + fill: '#ccc', + text: args['site'], + font: '16px Arial' + } + }] + }], + series:chat['seriesData'], + } + + statEc.setOption(option); + }); +} + + +function wsOverview(){ +//////////////////////////////////////////////////////////////////////////////////////////////////////// +var randstr = getRandomString(10); + +var html = '
\ +
\ + 网站: \ + \ + 时间: \ +
\ +
\ + \ + \ + \ + \
\ -
\ -
'; - - var html = '
\ -
\ - 网站: \ - \ - 时间: \ -
\ -
\ - \ - \ - \ - \ -
\ - \ -
\ + \ +
\ + 时间: \ +
\ +
\ + \ + \
\ -
\ - 请求类型: \ - \ - 状态码: \ - \ - 蜘蛛过滤: \ - \ - URL过滤: \ -
\ - \ -
\ - \ -
\ -
\ +
\ +
\ +
\ + \
\ - '+table+'\ -
'; - $(".soft-man-con").html(html); - $('#wsPage').html(rdata.data.page); +
\ +
\ + \ +
\ +
\ +

浏览量(PV)?

\ +

0

\ +
\ +
\ +

访客量(UV)?

\ +

0

\ +
\ +
\ +

IP数?

\ +

0

\ +
\ +
\ +

流量?

\ +

0

\ +
\ +
\ +

请求?

\ +

0

\ +
\ +
\ +

实时流量?

\ +

0

\ +
\ +
\ +

每秒请求?

\ +

0

\ +
\ +
\ +
\ +
\ + 趋势指标: \ +
\ + \ + 浏览量(PV)\ +
\ +
\ + \ + 访客量(UV)\ +
\ +
\ + \ + IP数\ +
\ +
\ + \ + 流量\ +
\ +
\ + \ + 请求\ +
\ +
\ + \ + 实时流量\ +
\ +
\ + \ + 每秒请求\ +
\ +
\ +
\ +
\ +
'; +$(".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 wsSitesList(){ + +} + function wsSpiderStatLogRequest(page){ var args = {};