mirror of
https://github.com/lijiejie/eyes.sh.git
synced 2026-09-22 01:30:43 +08:00
add IP count
This commit is contained in:
@@ -25,6 +25,7 @@ urlpatterns = [
|
|||||||
re_path(r'^rebind/gen$', views.rebind_gen, name='rebind_gen'),
|
re_path(r'^rebind/gen$', views.rebind_gen, name='rebind_gen'),
|
||||||
re_path(r'^as_admin/$', views.as_admin, name='as_admin'),
|
re_path(r'^as_admin/$', views.as_admin, name='as_admin'),
|
||||||
re_path(r'^ip2location$', views.ip_to_location, name='ip_to_location'),
|
re_path(r'^ip2location$', views.ip_to_location, name='ip_to_location'),
|
||||||
|
re_path(r'^ip_count/(.+?)$', views.ip_count, name='ip_count'),
|
||||||
re_path(r'^config/update$', views.config_update, name='config_update'),
|
re_path(r'^config/update$', views.config_update, name='config_update'),
|
||||||
path('i18n/', include('django.conf.urls.i18n')),
|
path('i18n/', include('django.conf.urls.i18n')),
|
||||||
re_path(r'^.*$', views.index, name='index'),
|
re_path(r'^.*$', views.index, name='index'),
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ from django.conf import settings
|
|||||||
from django.contrib.auth import logout
|
from django.contrib.auth import logout
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from django.db.models import Count
|
||||||
|
from django.http import JsonResponse
|
||||||
|
from django.db.models import F
|
||||||
|
|
||||||
|
|
||||||
def get_city_by_ip(ip):
|
def get_city_by_ip(ip):
|
||||||
@@ -501,6 +504,19 @@ def ip_to_location(request):
|
|||||||
return HttpResponse(json.dumps(found))
|
return HttpResponse(json.dumps(found))
|
||||||
|
|
||||||
|
|
||||||
|
def ip_count(request, type):
|
||||||
|
userid = request.session.get('userid', None)
|
||||||
|
if not userid:
|
||||||
|
return redirect('/login')
|
||||||
|
obj = []
|
||||||
|
if type == 'dns':
|
||||||
|
obj = DNSLog.objects.filter(Q(user_id=userid)).values('ip').annotate(total=Count('ip')).order_by('-total', 'ip')
|
||||||
|
elif type == 'web':
|
||||||
|
obj = WebLog.objects.filter(Q(user_id=userid)).values('remote_addr').annotate(total=Count('remote_addr')).annotate(ip= F('remote_addr')).order_by('-total', 'ip')
|
||||||
|
|
||||||
|
return JsonResponse({"data": list(obj)}, safe=False)
|
||||||
|
|
||||||
|
|
||||||
def config_update(request):
|
def config_update(request):
|
||||||
userid = request.session.get('userid', None)
|
userid = request.session.get('userid', None)
|
||||||
config_name = request.GET.get('name', '')
|
config_name = request.GET.get('name', '')
|
||||||
|
|||||||
+18
-5
@@ -2,33 +2,46 @@
|
|||||||
<nav>
|
<nav>
|
||||||
<ul class="pagination">
|
<ul class="pagination">
|
||||||
|
|
||||||
{% if logs.has_previous %}
|
{% if numpages > 5 %}
|
||||||
<li class="page-item"><a class="page-link" href="?page={{ logs.previous_page_number }}">
|
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page=1">
|
||||||
<span aria-hidden="true">«</span></a></li>
|
<span aria-hidden="true">«</span></a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if logs.has_previous %}
|
||||||
|
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ logs.previous_page_number }}">
|
||||||
|
<span aria-hidden="true">Previous</span></a></li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li class="page-item disabled"><span class="page-link" aria-hidden="true">«</span></li>
|
<li class="page-item disabled"><span class="page-link" aria-hidden="true">Previous</span></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if logs.number|add:'-4' > 1 %}
|
{% if logs.number|add:'-4' > 1 %}
|
||||||
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ logs.number|add:'-5' }}">…</a></li>
|
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ logs.number|add:'-5' }}">…</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% spaceless %}
|
||||||
{% for i in logs.paginator.page_range %}
|
{% for i in logs.paginator.page_range %}
|
||||||
|
|
||||||
{% if logs.number == i %}
|
{% if logs.number == i %}
|
||||||
<li class="page-item active"><span class="page-link">{{ i }} <span class="sr-only">(current)</span></span></li>
|
<li class="page-item active"><span class="page-link">{{ i }} <span class="sr-only">(current)</span></span></li>
|
||||||
{% elif i > logs.number|add:'-5' and i < logs.number|add:'5' %}
|
{% elif i > logs.number|add:'-5' and i < logs.number|add:'5' %}
|
||||||
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ i }}">{{ i }}</a></li>
|
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ i }}">{{ i }}</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
{% endspaceless %}
|
||||||
|
|
||||||
{% if logs.paginator.num_pages > logs.number|add:'4' %}
|
{% if logs.paginator.num_pages > logs.number|add:'4' %}
|
||||||
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ logs.number|add:'5' }}">…</a></li>
|
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ logs.number|add:'5' }}">…</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if logs.has_next %}
|
{% if logs.has_next %}
|
||||||
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ logs.next_page_number }}"><span aria-hidden="true">»</span></a></li>
|
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ logs.next_page_number }}"><span aria-hidden="true">Next</span></a></li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li class="page-item disabled"><span class="page-link" aria-hidden="true">»</span></li>
|
<li class="page-item disabled"><span class="page-link" aria-hidden="true">Next</span></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if numpages > 5 %}
|
||||||
|
<li class="page-item"><a class="page-link" href="?{{ query_prefix }}page={{ numpages }}">
|
||||||
|
<span aria-hidden="true">»</span></a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<span class="page-link ml-4" style="border: none">{% blocktranslate %}第{{ page }}页 / 共{{ numpages }}页, 共{{ total }}条记录{% endblocktranslate %}</span>
|
<span class="page-link ml-4" style="border: none">{% blocktranslate %}第{{ page }}页 / 共{{ numpages }}页, 共{{ total }}条记录{% endblocktranslate %}</span>
|
||||||
|
|||||||
+25
-3
@@ -60,7 +60,8 @@
|
|||||||
</div>
|
</div>
|
||||||
{% include 'auto_reload.html' %}
|
{% include 'auto_reload.html' %}
|
||||||
</form>
|
</form>
|
||||||
|
<div id="ip_count" class="d-flex flex-wrap">
|
||||||
|
</div>
|
||||||
<div data-example-id="hoverable-table">
|
<div data-example-id="hoverable-table">
|
||||||
<table class="table table-hover">
|
<table class="table table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
@@ -68,7 +69,7 @@
|
|||||||
<th>ID</th>
|
<th>ID</th>
|
||||||
<th>{% translate '域名' %}</th>
|
<th>{% translate '域名' %}</th>
|
||||||
<th>Type</th>
|
<th>Type</th>
|
||||||
<th>IP</th>
|
<th>IP<button id="btnCountIPs" class="btn btn-sm btn-info py-0 ml-2" onclick="count_ips('dns')">Count</button></th>
|
||||||
<th>{% translate '位置' %}
|
<th>{% translate '位置' %}
|
||||||
<div class="spinner-grow spinner-grow-sm" role="status" id="spinner_location">
|
<div class="spinner-grow spinner-grow-sm" role="status" id="spinner_location">
|
||||||
</div>
|
</div>
|
||||||
@@ -109,13 +110,15 @@
|
|||||||
</div>
|
</div>
|
||||||
{% include 'auto_reload.html' %}
|
{% include 'auto_reload.html' %}
|
||||||
</form>
|
</form>
|
||||||
|
<div id="ip_count" class="d-flex flex-wrap">
|
||||||
|
</div>
|
||||||
<div data-example-id="hoverable-table">
|
<div data-example-id="hoverable-table">
|
||||||
<table class="table table-hover">
|
<table class="table table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>ID</th>
|
<th>ID</th>
|
||||||
<th style="width: 350px;">URL</th>
|
<th style="width: 350px;">URL</th>
|
||||||
<th>IP</th>
|
<th>IP<button id="btnCountIPs" class="btn btn-sm btn-info py-0 ml-2" onclick="count_ips('web')">Count</button></th>
|
||||||
<th>{% translate '位置' %}
|
<th>{% translate '位置' %}
|
||||||
<div class="spinner-grow spinner-grow-sm" role="status" id="spinner_location">
|
<div class="spinner-grow spinner-grow-sm" role="status" id="spinner_location">
|
||||||
</div>
|
</div>
|
||||||
@@ -543,6 +546,25 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function count_ips(type){
|
||||||
|
$('#btnCountIPs').attr("disabled", true);
|
||||||
|
$.get("/ip_count/" + type, function(result){
|
||||||
|
$('#ip_count').html('');
|
||||||
|
for (let i = 0; i < result['data'].length - 1; i++) {
|
||||||
|
html = `
|
||||||
|
<a href="?ip=${result['data'][i]['ip']}" target="_blank">
|
||||||
|
<div class="card rounded-1 bg-light mr-4 my-1" style="width: 110px;" >
|
||||||
|
<div class="card-body p-0 justify-content-between d-flex">
|
||||||
|
<span class="badge bg-light" >${result['data'][i]['ip']}</span> <span class="badge bg-warning float-end rounded-1">${result['data'][i]['total']}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>`;
|
||||||
|
$('#ip_count').append(html);
|
||||||
|
}
|
||||||
|
$('#btnCountIPs').attr("disabled", false);
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
Reference in New Issue
Block a user