Browse Source

修改index页面

pull/26/head
ibuler 9 years ago
parent
commit
0174da6c77
  1. 154
      jumpserver/views.py
  2. 162
      templates/index.html

154
jumpserver/views.py

@ -36,42 +36,44 @@ def getDaysByNum(num):
return date_li, date_str return date_li, date_str
def get_data(data, items, option): def get_data(x, y, z):
dic = {} pass
li_date, li_str = getDaysByNum(7)
for item in items:
li = []
name = item[option]
if option == 'user':
option_data = data.filter(user=name)
elif option == 'host':
option_data = data.filter(host=name)
for t in li_date:
year, month, day = t.year, t.month, t.day
times = option_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).count()
li.append(times)
dic[name] = li
return dic
def get_count_by_day(date_li, item): def get_data_by_day(date_li, item):
data_li = [] data_li = []
for d in date_li: for d in date_li:
logs = Log.objects.filter(start_time__year=d.year, logs = Log.objects.filter(start_time__year=d.year,
start_time__month=d.month, start_time__month=d.month,
start_time__day=d.day) start_time__day=d.day)
if item == 'user': if item == 'user':
count = len(set([log.user for log in logs])) data_li.append(set([log.user for log in logs]))
elif item == 'asset': elif item == 'asset':
count = len(set([log.host for log in logs])) data_li.append(set([log.host for log in logs]))
elif item == 'login': elif item == 'login':
count = len(logs) data_li.append(logs)
else: else:
count = 0 pass
data_li.append(count)
return data_li return data_li
def get_count_by_day(date_li, item):
data_li = get_data_by_day(date_li, item)
data_count_li = []
for data in data_li:
data_count_li.append(len(data))
return data_count_li
def get_count_by_date(date_li, item):
data_li = get_data_by_day(date_li, item)
data_count_tmp = []
for data in data_li:
data_count_tmp.extend(list(data))
return len(set(data_count_tmp))
@require_role(role='user') @require_role(role='user')
def index_cu(request): def index_cu(request):
user_id = request.user.id user_id = request.user.id
@ -102,6 +104,7 @@ def index(request):
return index_cu(request) return index_cu(request)
elif is_role_request(request, 'super'): elif is_role_request(request, 'super'):
# dashboard 显示汇总
users = User.objects.all() users = User.objects.all()
hosts = Asset.objects.all() hosts = Asset.objects.all()
online = Log.objects.filter(is_finished=0) online = Log.objects.filter(is_finished=0)
@ -109,75 +112,52 @@ def index(request):
online_user = online.values('user').distinct() online_user = online.values('user').distinct()
active_users = User.objects.filter(is_active=1) active_users = User.objects.filter(is_active=1)
active_hosts = Asset.objects.filter(is_active=1) active_hosts = Asset.objects.filter(is_active=1)
week_data = Log.objects.filter(start_time__range=[from_week, datetime.datetime.now()])
# 一个月历史汇总
date_li, date_str = getDaysByNum(30) date_li, date_str = getDaysByNum(30)
date_month = repr(date_str) date_month = repr(date_str)
print date_month active_user_per_month = str(get_count_by_day(date_li, 'user'))
active_user_month = str(get_count_by_day(date_li, 'user')) active_asset_per_month = str(get_count_by_day(date_li, 'asset'))
active_asset_month = str(get_count_by_day(date_li, 'asset')) active_login_per_month = str(get_count_by_day(date_li, 'login'))
active_login_month = str(get_count_by_day(date_li, 'login'))
# 活跃用户资产图
active_user_month = get_count_by_date(date_li, 'user')
disabled_user_count = len(users.filter(is_active=False))
inactive_user_month = len(users) - active_user_month
active_asset_month = get_count_by_date(date_li, 'asset')
disabled_asset_count = len(hosts.filter(is_active=False)) if hosts.filter(is_active=False) else 0
inactive_asset_month = len(hosts) - active_asset_month if len(hosts) > active_asset_month else 0
# 一周top10用户和主机
week_data = Log.objects.filter(start_time__range=[from_week, datetime.datetime.now()])
user_top_ten = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:10]
host_top_ten = week_data.values('host').annotate(times=Count('host')).order_by('-times')[:10]
for user_info in user_top_ten:
username = user_info.get('user')
last = Log.objects.filter(user=username).latest('start_time')
user_info['last'] = last
for host_info in host_top_ten:
host = host_info.get('host')
last = Log.objects.filter(host=host).latest('start_time')
host_info['last'] = last
# 一周top5
week_users = week_data.values('user').distinct().count()
week_hosts = week_data.count()
user_top_five = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:5]
color = ['label-success', 'label-info', 'label-primary', 'label-default', 'label-warnning']
# 最后10次权限申请
# perm apply latest 10
# perm_apply_10 = Apply.objects.order_by('-date_add')[:10]
# 最后10次登陆
login_10 = Log.objects.order_by('-start_time')[:10]
login_more_10 = Log.objects.order_by('-start_time')[10:21]
elif is_role_request(request, 'admin'):
return index_cu(request)
# user = get_session_user_info(request)[2]
# users = User.objects.filter(dept=dept)
# hosts = Asset.objects.filter(dept=dept)
# online = Log.objects.filter(dept_name=dept_name, is_finished=0)
# online_host = online.values('host').distinct()
# online_user = online.values('user').distinct()
# active_users = users.filter(is_active=1)
# active_hosts = hosts.filter(is_active=1)
# week_data = Log.objects.filter(dept_name=dept_name, start_time__range=[from_week, datetime.datetime.now()])
# percent of dashboard
if users.count() == 0:
percent_user, percent_online_user = '0%', '0%'
else:
percent_user = format(active_users.count() / users.count(), '.0%')
percent_online_user = format(online_user.count() / users.count(), '.0%')
if hosts.count() == 0:
percent_host, percent_online_host = '0%', '0%'
else:
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
user_top_ten = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:10]
host_top_ten = week_data.values('host').annotate(times=Count('host')).order_by('-times')[:10]
user_dic, host_dic = get_data(week_data, user_top_ten, 'user'), get_data(week_data, host_top_ten, 'host')
# a week data
week_users = week_data.values('user').distinct().count()
week_hosts = week_data.count()
user_top_five = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:5]
color = ['label-success', 'label-info', 'label-primary', 'label-default', 'label-warnning']
# perm apply latest 10
# perm_apply_10 = Apply.objects.order_by('-date_add')[:10]
# latest 10 login
login_10 = Log.objects.order_by('-start_time')[:10]
login_more_10 = Log.objects.order_by('-start_time')[10:21]
# a week top 10
for user_info in user_top_ten:
username = user_info.get('user')
last = Log.objects.filter(user=username).latest('start_time')
user_info['last'] = last
top = {'user': '活跃用户数', 'host': '活跃主机数', 'times': '登录次数'}
top_dic = {}
for key, value in top.items():
li = []
for t in li_date:
year, month, day = t.year, t.month, t.day
if key != 'times':
times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).values(key).distinct().count()
else:
times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).count()
li.append(times)
top_dic[value] = li
return render_to_response('index.html', locals(), context_instance=RequestContext(request)) return render_to_response('index.html', locals(), context_instance=RequestContext(request))

162
templates/index.html

@ -14,7 +14,7 @@
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<h1 class="no-margins"><a href="/juser/user_list/">{{ users.count}}</a></h1> <h1 class="no-margins"><a href="/juser/user_list/">{{ users.count}}</a></h1>
<div class="stat-percent font-bold text-success">{{ percent_user }} <i class="fa fa-bolt"></i></div> {# <div class="stat-percent font-bold text-success">{{ percent_user }} <i class="fa fa-bolt"></i></div>#}
<small>All user</small> <small>All user</small>
</div> </div>
</div> </div>
@ -27,7 +27,7 @@
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<h1 class="no-margins"><a href="/jasset/host_list/">{{ hosts.count }}</a></h1> <h1 class="no-margins"><a href="/jasset/host_list/">{{ hosts.count }}</a></h1>
<div class="stat-percent font-bold text-info">{{ percent_host }} <i class="fa fa-level-up"></i></div> {# <div class="stat-percent font-bold text-info">{{ percent_host }} <i class="fa fa-level-up"></i></div>#}
<small>All host</small> <small>All host</small>
</div> </div>
</div> </div>
@ -40,8 +40,8 @@
<h5>实时在线用户</h5> <h5>实时在线用户</h5>
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<h1 class="no-margins"><a href="/jlog/log_list/online/"> <span id="online_users">10</span></a></h1> <h1 class="no-margins"><a href="/jlog/log_list/online/"> <span id="online_users">{{ online_user | length }}</span></a></h1>
<div class="stat-percent font-bold text-navy">{{ percent_online_user }} <i class="fa fa-level-up"></i></div> {# <div class="stat-percent font-bold text-navy">{{ percent_online_user }} <i class="fa fa-level-up"></i></div>#}
<small>Online user</small> <small>Online user</small>
</div> </div>
</div> </div>
@ -54,8 +54,8 @@
<h5>已连接服务器</h5> <h5>已连接服务器</h5>
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<h1 class="no-margins"><a href="/jlog/log_list/online/"> <span id="online_hosts">10</span></a></h1> <h1 class="no-margins"><a href="/jlog/log_list/online/"> <span id="online_hosts">{{ online_host | length }}</span></a></h1>
<div class="stat-percent font-bold text-danger">{{ percent_online_host }} <i class="fa fa-level-down"></i></div> {# <div class="stat-percent font-bold text-danger">{{ percent_online_host }} <i class="fa fa-level-down"></i></div>#}
<small>Connected host</small> <small>Connected host</small>
</div> </div>
</div> </div>
@ -151,6 +151,51 @@
</div> </div>
</div> </div>
</div> </div>
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>一周Top10资产</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user"></ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content ibox-heading">
<h3><i class="fa fa-user"></i> 一周Top10资产 </h3>
<small><i class="fa fa-map-marker"></i> 登录次数及最近一次登录记录. </small>
</div>
<div class="ibox-content inspinia-timeline">
{% if host_top_ten %}
{% for data in host_top_ten %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<strong>{{ data.host }}</strong>
<br/>
<small class="text-navy">{{ data.times }}次</small>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs">最近一次登录用户</p>
<p>{{ data.last.user }}</p>
<p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p>
</div>
</div>
</div>
{% endfor %}
{% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div>
</div>
</div> </div>
<div class="col-lg-4"> <div class="col-lg-4">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
@ -162,7 +207,7 @@
</div> </div>
<div class="ibox-content ibox-heading"> <div class="ibox-content ibox-heading">
<h3><i class="fa fa-paper-plane-o"></i> 登录记录 </h3> <h3><i class="fa fa-paper-plane-o"></i> 登录记录 </h3>
<small<i class="fa fa-map-marker"></i> 最近十次登录记录. </small> <small><i class="fa fa-map-marker"></i> 最近十次登录记录. </small>
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<div> <div>
@ -237,7 +282,7 @@
</div> </div>
<div class="ibox-content ibox-heading"> <div class="ibox-content ibox-heading">
<h3><i class="fa fa-user"></i> 一周Top10用户 </h3> <h3><i class="fa fa-user"></i> 一周Top10用户 </h3>
<small><i class="fa fa-map-marker"></i> 一周Top10用户登录次数及最近一次登录记录. </small> <small><i class="fa fa-map-marker"></i> 用户登录次数及最近一次登录记录. </small>
</div> </div>
<div class="ibox-content inspinia-timeline"> <div class="ibox-content inspinia-timeline">
{% if user_top_ten %} {% if user_top_ten %}
@ -251,7 +296,7 @@
<small class="text-navy">{{ data.times }}次</small> <small class="text-navy">{{ data.times }}次</small>
</div> </div>
<div class="col-xs-7 content no-top-border"> <div class="col-xs-7 content no-top-border">
<p class="m-b-xs">最近一次登录</p> <p class="m-b-xs">最近一次登录主机</p>
<p>{{ data.last.host }}</p> <p>{{ data.last.host }}</p>
<p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p> <p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p>
</div> </div>
@ -272,6 +317,7 @@
<!--<div class="col-lg-6" id="hosttop10" style="width:50%;height:400px; margin-top: 20px"></div>--> <!--<div class="col-lg-6" id="hosttop10" style="width:50%;height:400px; margin-top: 20px"></div>-->
<!--</div>--> <!--</div>-->
</div> </div>
</div>
<script src="/static/js/echarts/echarts.js"></script> <script src="/static/js/echarts/echarts.js"></script>
<script> <script>
@ -337,22 +383,22 @@ $(document).ready(function(){
type:'line', type:'line',
smooth:true, smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}}, itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: {{ active_login_month | safe }} data: {{ active_login_per_month | safe }}
}, },
{ {
name:'活跃用户', name:'活跃用户',
type:'line', type:'line',
smooth:true, smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}}, itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: {{ active_user_month | safe }} data: {{ active_user_per_month | safe }}
}, },
{ {
name:'活跃资产', name:'活跃资产',
type:'line', type:'line',
smooth:true, smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}}, itemStyle: {normal: {areaStyle: {type: 'default'}}},
data: {{ active_asset_month | safe }} data: {{ active_asset_per_month | safe }}
}, }
] ]
}; };
@ -368,7 +414,6 @@ $(document).ready(function(){
], ],
function (ec) { function (ec) {
var auChart = ec.init(document.getElementById('activeUser')); var auChart = ec.init(document.getElementById('activeUser'));
var aaChart = ec.init(document.getElementById('activeAsset'));
var option = { var option = {
tooltip : { tooltip : {
trigger: 'item', trigger: 'item',
@ -378,7 +423,7 @@ $(document).ready(function(){
show: false, show: false,
orient : 'vertical', orient : 'vertical',
x : 'left', x : 'left',
data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎'] data:['月活跃用户','禁用用户','月未登陆用户']
}, },
toolbox: { toolbox: {
show : false, show : false,
@ -428,17 +473,94 @@ $(document).ready(function(){
} }
}, },
data:[ data:[
{value:335, name:'直接访问'}, {value:{{ active_user_month }}, name:'月活跃用户'},
{value:310, name:'邮件营销'}, {value:{{ disabled_user_count }}, name:'禁用用户'},
{value:234, name:'联盟广告'}, {value:{{ inactive_user_month }}, name:'月未登陆用户'}
{value:135, name:'视频广告'},
{value:1548, name:'搜索引擎'}
] ]
} }
] ]
}; };
auChart.setOption(option); auChart.setOption(option);
}
);
require(
[
'echarts',
'echarts/chart/pie'
],
function (ec) {
var aaChart = ec.init(document.getElementById('activeAsset'));
var option = {
tooltip : {
trigger: 'item',
formatter: "{b} <br> {c} ({d}%)"
},
legend: {
show: false,
orient : 'vertical',
x : 'left',
data:['月被登陆主机','禁用主机','月未登陆主机']
},
toolbox: {
show : false,
feature : {
mark : {show: true},
dataView : {show: true, readOnly: false},
magicType : {
show: true,
type: ['pie', 'funnel'],
option: {
funnel: {
x: '25%',
width: '50%',
funnelAlign: 'center',
max: 1548
}
}
},
restore : {show: true},
saveAsImage : {show: true}
}
},
calculable : true,
series : [
{
name:'访问来源',
type:'pie',
radius : ['50%', '70%'],
itemStyle : {
normal : {
label : {
show : false
},
labelLine : {
show : false
}
},
emphasis : {
label : {
show : true,
position : 'center',
textStyle : {
fontSize : '5',
fontWeight : 'bold'
}
}
}
},
data:[
{value:{{ active_asset_month }}, name:'月被登陆主机'},
{value:{{ disabled_asset_count }}, name:'禁用主机'},
{value:{{ inactive_asset_month }}, name:'月未登陆主机'}
]
}
]
};
aaChart.setOption(option); aaChart.setOption(option);
} }
); );

Loading…
Cancel
Save