pull/139/head
midoks 3 years ago
parent 2b4e5684a1
commit 522e6430ee
  1. 2
      plugins/mysql/js/mysql.js
  2. 89
      plugins/webstats/index.html
  3. 37
      plugins/webstats/index.py
  4. 76
      plugins/webstats/js/setting.js
  5. 108
      plugins/webstats/js/stats.js

@ -1001,7 +1001,7 @@ function dbList(page, search){
'+ list +'\
</tbody></table>\
</div>\
<div id="databasePage" class="dataTables_paginate paging_bootstrap page"></div>\
<div id="databasePage" class="dataTables_paginate paging_bootstrap page"></div>\
<div class="table_toolbar">\
<span class="sync btn btn-default btn-sm" style="margin-right:5px" onclick="syncToDatabase(1)" title="将选中数据库信息同步到服务器">同步选中</span>\
<span class="sync btn btn-default btn-sm" style="margin-right:5px" onclick="syncToDatabase(0)" title="将所有数据库信息同步到服务器">同步所有</span>\

@ -1,19 +1,100 @@
<style type="text/css">
.ws_setting {
margin: 15px 0;
}
.ws_setting .ws_title {
display: inline-block;
width: 100px;
vertical-align: top;
margin: 6px 15px 0 0;
}
.ws_setting .ws_content{
display: inline-block;
}
.ws_setting .ws_content div {
display: inline-block;
}
.ws_setting .ws_content .choose_title {
width: 110px;
}
.ws_setting .ws_content .bt-input-text {
height: 26px;
}
.ws_setting .ws_content .ws_tips {
color: #777;
margin-left: -10px;
vertical-align: middle;
}
.ws_setting .tab-nav {
margin-bottom: 10px;
}
.ws_setting .ws_content textarea {
border-color: #ddd;
display: block;
margin-top: 10px;
margin-left: -10px;
font-size: 13px;
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;
padding-bottom: 10px;
}
.dash_line{
margin-top: 15px;
padding-top: 15px;
border-top:#ccc 1px dashed;
}
</style>
<div class="bt-form">
<div class="bt-w-main">
<div class="bt-w-menu">
<p class="bgw" onclick="pluginService('webstats');">服务</p>
<p onclick="wsGlobalSetting();">概览</p>
<p onclick="wsGlobalSetting();">网站日志</p>
<p onclick="wsSites();">网站日志</p>
<p onclick="wsGlobalSetting();">全局设置</p>
</div>
<div class="bt-w-con pd15">
<div class="bt-w-con pd15" style="height: 550px; overflow: auto;">
<div class="soft-man-con"></div>
</div>
</div>
</div>
<script type="text/javascript">
resetPluginWinWidth(800);
resetPluginWinWidth(830);
$.getScript( "/static/js/echarts.min.js", function(){
console.log("echarts load done");
});
$.getScript( "/plugins/file?name=webstats&f=js/stats.js", function(){
pluginService('webstats');
});

@ -67,8 +67,8 @@ def status():
def pSqliteDb(dbname='web_logs', site_name='unset'):
db_dir = getServerDir() + '/logs/' + site_name
db_dir = getServerDir() + '/logs/' + site_name
if not os.path.exists(db_dir):
mw.execShell('mkdir -p ' + db_dir)
@ -82,7 +82,7 @@ def pSqliteDb(dbname='web_logs', site_name='unset'):
for index in range(len(sql_list)):
conn.execute(sql_list[index], ())
else:
conn = mw.M(dbname).dbPos(getServerDir(), name)
conn = mw.M(dbname).dbPos(db_dir, name)
return conn
@ -193,6 +193,37 @@ def reload():
return 'ok'
def getLogsList():
args = getArgs()
check = checkArgs(args, ['page', 'page_size', 'site'])
if not check[0]:
return check[1]
page = int(args['page'])
page_size = int(args['page_size'])
domain = args['site']
limit = str((page - 1) * page_size) + ',' + str(page_size)
conn = pSqliteDb('web_logs', domain)
field = 'time,ip,domain,server_name,method,status_code,request_time,uri,body_length'
condition = ''
clist = conn.field(
field).limit(limit).order('time desc').select()
count = conn.count()
data = {}
_page = {}
_page['count'] = count
_page['p'] = page
_page['row'] = page_size
_page['tojs'] = 'wsSites'
data['page'] = mw.getPage(_page)
data['data'] = clist
return mw.returnJson(True, 'ok', data)
if __name__ == "__main__":
func = sys.argv[1]
if func == 'status':
@ -209,5 +240,7 @@ if __name__ == "__main__":
print(runInfo())
elif func == 'conf':
print(getConf())
elif func == 'get_logs_list':
print(getLogsList())
else:
print('error')

@ -1,4 +1,78 @@
function wsGlobalSetting(){
var html = '<div>\
<div class="ws_setting">\
<div class="ws_title">监控统计:</div>\
<div class="ws_content">\
<div class="item-line">\
<div class="choose_title">监控开关</div>\
<input type="number" class="bt-input-text" name="ip_total" value="50" style="width:55px;">\
<button type="button" class="btn btn-default btn-sm" bt-event-click="totalNumSubmit" style="margin-left: 62px;"><span>保存</span></button>\
<span class="tips" data-toggle="tooltip" data-placement="bottom" title="缩短日志保存天数原有记录的日志将被删除,请谨慎操作">?</span>\
</div>\
<div class="item-line">\
<div class="choose_title">URI统计</div>\
<input type="number" class="bt-input-text" name="ip_total" value="50" style="width:55px;">\
<button type="button" class="btn btn-default btn-sm" bt-event-click="totalNumSubmit" style="margin-left: 62px;"><span>保存</span></button>\
<span class="tips" data-toggle="tooltip" data-placement="top" title="缩短日志保存天数原有记录的日志将被删除,请谨慎操作">?</span>\
</div>\
</div>\
</div>\
<div class="dash_line"></div>\
<div class="ws_setting">\
<div class="ws_title">统计:</div>\
<div class="ws_content">\
<div class="item-line">\
<div class="choose_title">IP统计</div>\
<input type="number" class="bt-input-text" name="ip_total" value="50" style="width:55px;">\
<button type="button" class="btn btn-default btn-sm" bt-event-click="totalNumSubmit" style="margin-left: 62px;"><span>保存</span></button>\
<span class="tips" data-toggle="tooltip" data-placement="top" title="设置IP统计页面的TOP数量">?</span>\
</div>\
<div class="item-line">\
<div class="choose_title">URI统计</div>\
<input type="number" class="bt-input-text" name="ip_total" value="50" style="width:55px;">\
<button type="button" class="btn btn-default btn-sm" bt-event-click="totalNumSubmit" style="margin-left: 62px;"><span>保存</span></button>\
<span class="tips" data-toggle="tooltip" data-placement="top" title="设置URI统计页面的TOP数量">?</span>\
</div>\
</div>\
</div>\
<div class="dash_line"></div>\
<div class="ws_setting">\
<div class="ws_title">日志:</div>\
<div class="ws_content">\
<div class="item-line">\
<div class="choose_title">日志保存天数</div>\
<input type="number" class="bt-input-text" name="ip_total" value="50" style="width:55px;">/ \
<button type="button" class="btn btn-default btn-sm" bt-event-click="totalNumSubmit" style="margin-left: 43px;"><span>保存</span></button>\
<span class="tips" data-toggle="tooltip" data-placement="top" title="缩短日志保存天数原有记录的日志将被删除,请谨慎操作">?</span>\
</div>\
</div>\
</div>\
<div class="dash_line"></div>\
<div class="ws_setting">\
<div class="ws_title">监控配置:</div>\
<div class="ws_content" style="width:570px;">\
<div class="tab-nav">\
<span data-type="cdn_headers" class="on">CDN headers</span>\
<span data-type="exclude_extension">排除扩展</span>\
<span data-type="exclude_status">排除响应状态</span>\
<span data-type="exclude_url">排除路径</span>\
<span data-type="exclude_ip">排除IP</span>\
<span data-type="record_post_args">记录请求原文</span>\
</div>\
<div class="tab-con">\
<span class="ws_tips">* 排除的请求不写入网站日志不统计PVUVIP只累计总请求总流量数如需多个请换行填写</span>\
<textarea name="setting-cdn" cols="52" rows="8"></textarea>\
</div>\
<p style="margin-top:10px">\
<button type="button" class="btn btn-success btn-sm" bt-event-click="submitSetting" name="set">保存</button>\
<button type="button" class="btn btn-default btn-sm" bt-event-click="submitSetting" name="setAll" style="margin-left: 10px;">同步所有站点</button>\
<span class="ws_tips">*保存同步所有站点只会保存/同步当前所选中的监控配置内容</span>\
</p>\
</div>\
</div>\
<div class="dash_line"></div>\
</div>';
$(".soft-man-con").html(html);
$('[data-toggle="tooltip"]').tooltip();
}

@ -62,3 +62,111 @@ function wsPostCallbak(method, version, args,callback){
}
},'json');
}
function wsSites(){
var args = {};
args['page'] = 1;
args['page_size'] = 10;
args['site'] = 'unset';
wsPost('get_logs_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>';
}
var table = '<div class="divtable mtb10">\
<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>IP</th>\
<th>响应</th>\
<th>耗时</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 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);
$('#wsPage').html(rdata.data.page);
});
}

Loading…
Cancel
Save