diff --git a/Access_Logs.php b/Access_Logs.php index 167df3a..8f63d27 100644 --- a/Access_Logs.php +++ b/Access_Logs.php @@ -42,6 +42,7 @@ class Access_Logs { $ip = array_key_exists('ip', $filters) ? $filters['ip'] : ''; $ua = array_key_exists('ua', $filters) ? $filters['ua'] : ''; $cid = array_key_exists('cid', $filters) ? $filters['cid'] : ''; + $url = array_key_exists('url', $filters) ? $filters['url'] : ''; $path = array_key_exists('path', $filters) ? $filters['path'] : ''; $robot = array_key_exists('robot', $filters) ? $filters['robot'] : ''; $preset = array_key_exists('preset', $filters) ? $filters['preset'] : ''; @@ -59,6 +60,9 @@ class Access_Logs { if ($cid !== '') { $query->where('content_id' . $compare, $cid); } + if ($url !== $empty) { + $query->where('url' . $compare, $url); + } if ($path !== $empty) { $query->where('path' . $compare, $path); } @@ -95,6 +99,7 @@ class Access_Logs { 'ip' => $this->request->get('ip', ''), 'ua' => $this->request->get('ua', ''), 'cid' => $this->request->get('cid', ''), + 'url' => $this->request->get('url', ''), 'path' => $this->request->get('path', ''), 'robot' => $this->request->get('robot', ''), 'preset' => $this->request->get('preset', ''), @@ -163,6 +168,7 @@ class Access_Logs { $ip = $this->request->get('ip', ''); $ua = $this->request->get('ua', ''); $cid = $this->request->get('cid', ''); + $url = $this->request->get('url', ''); $path = $this->request->get('path', ''); $robot = $this->request->get('robot', ''); $preset = $this->request->get('preset', ''); @@ -174,11 +180,12 @@ class Access_Logs { } $counterQuery = $this->filterQueryBuilder($counterQuery, ['ids' => $ids], false); $operatorQuery = $this->filterQueryBuilder($operatorQuery, ['ids' => $ids], false); - } else if ($ip || $ua || $cid || $path || $robot || $preset) { + } else if ($ip || $ua || $cid || $url || $path || $robot || $preset) { $filters = array( 'ip' => $ip, 'ua' => $ua, 'cid' => $cid, + 'url' => $url, 'path' => $path, 'robot' => $robot, 'preset' => $preset, diff --git a/page/routes/logs/index.css b/page/routes/logs/index.css index be5696b..364793d 100644 --- a/page/routes/logs/index.css +++ b/page/routes/logs/index.css @@ -1,4 +1,6 @@ -a[data-action="search-anchor"] { +[data-action="search-anchor"], +[data-action="ua-information"], +[data-action="ip-information"] { cursor: pointer; } @@ -237,6 +239,42 @@ select.typecho-access-logs-filter-item__content { cursor: pointer; } +.typecho-access-logs-list-cell { + display: flex; + flex-wrap: wrap; + align-items: center; +} + +.typecho-access-logs-list-cell-item:first-child { + margin-right: 5px; +} + +.typecho-access-logs-list-cell-item-icon { + width: 18px; + height: 18px; + cursor: pointer; + opacity: .7; + background-size: 100% 100%; + background-position: center center; + background-repeat: no-repeat; +} + +.typecho-access-logs-list-cell-item-icon:hover { + opacity: 1; +} + +.typecho-access-logs-list-cell-item-information { + background-image: url("data:image/svg+xml;base64,PHN2ZyB0PSIxNjcwNTc1MDk3MDA4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE0Mzk0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMi4wMDEgOTI4Ljk5N2MyMzAuNTI0IDAgNDE4LjA3Ni0xODcuNTUyIDQxOC4wNzUtNDE4LjA3NyAwLTIzMC41MjctMTg3LjU1Mi00MTguMDc3LTQxOC4wNzUtNDE4LjA3N3MtNDE4LjA3NyAxODcuNTUtNDE4LjA3NyA0MTguMDc3YzAgMjMwLjUyNSAxODcuNTUyIDQxOC4wNzcgNDE4LjA3NyA0MTguMDc3ek01MTIgMzAxLjg4YzI4Ljg2IDAgNTIuMjYgMjMuMzk5IDUyLjI2IDUyLjI2MyAwIDI4Ljg1OC0yMy4zOTkgNTIuMjU3LTUyLjI2IDUyLjI1N3MtNTIuMjYtMjMuMzk5LTUyLjI2LTUyLjI1N2MwLTI4Ljg2MyAyMy4zOTktNTIuMjYzIDUyLjI2LTUyLjI2M3pNNDU5Ljc0IDUxMC45MjJjMC0yOC44NiAyMy4zOTktNTIuMjYgNTIuMjYtNTIuMjZzNTIuMjYgMjMuMzk5IDUyLjI2IDUyLjI2djE1Ni43NzVjMCAyOC44Ni0yMy4zOTkgNTIuMjYtNTIuMjYgNTIuMjZzLTUyLjI2LTIzLjM5OS01Mi4yNi01Mi4yNnYtMTU2Ljc3NXoiIHAtaWQ9IjE0Mzk1IiBmaWxsPSIjMTI5NmRiIj48L3BhdGg+PC9zdmc+"); +} + +.typecho-access-logs-list-cell-item-search { + background-image: url("data:image/svg+xml;base64,PHN2ZyB0PSIxNjcwODM1ODQyODg4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE4OTQ5IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTIzMi4xMDY2NjcgMjMyLjEwNjY2N2EzNTUuNTQxMzMzIDM1NS41NDEzMzMgMCAwIDEgNTMxLjI0MjY2NiA0NzAuOTEybDE2MS4yMzczMzQgMTYxLjE5NDY2NmE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMSAxLTYwLjM3MzMzNCA2MC4zNzMzMzRsLTE4OS41NjgtMTg5LjYxMDY2N2E0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAxIDAtNjAuMzMwNjY3IDI3MC4yMDggMjcwLjIwOCAwIDEgMC05Mi44IDYwLjcxNDY2NyA0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMSAxIDMwLjk3NiA3OS40ODhBMzU1LjYyNjY2NyAzNTUuNjI2NjY3IDAgMCAxIDIzMi4xNDkzMzMgMjMyLjE0OTMzM3oiIGZpbGw9IiMxMjk2ZGIiIHAtaWQ9IjE4OTUwIj48L3BhdGg+PHBhdGggZD0iTTQ4OS4wODggMzgyLjM3ODY2N2ExMDYuNjY2NjY3IDEwNi42NjY2NjcgMCAwIDAtMTA2LjY2NjY2NyAxMDYuNjY2NjY2IDQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDEtODUuMzMzMzMzIDAgMTkyIDE5MiAwIDAgMSAxOTItMTkyIDQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDEgMCA4NS4zMzMzMzR6IiBmaWxsPSIjMTI5NmRiIiBwLWlkPSIxODk1MSI+PC9wYXRoPjwvc3ZnPg=="); +} + +.typecho-access-logs-list-cell-item-delete { + background-image: url("data:image/svg+xml;base64,PHN2ZyB0PSIxNjcwNTc0OTQxODMyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjEzMjc5IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTU4Ni4zODEwNTggMzIyLjczNDQwMiIgcC1pZD0iMTMyODAiIGZpbGw9IiNkODFlMDYiPjwvcGF0aD48cGF0aCBkPSJNMTkxLjkwMjY1OCAxNjguODgxMzM4bDYzOS42MDYyODMgMCAwIDg3LjAyMDkzNi02MzkuNjA2MjgzIDAgMC04Ny4wMjA5MzZaIiBwLWlkPSIxMzI4MSIgZmlsbD0iI2Q4MWUwNiI+PC9wYXRoPjxwYXRoIGQ9Ik03MDMuNTg3NDggMjMyLjg0MjA2OWMwIDIzLjA2MDIwNS02My45NjA3MzEgMjMuMDYwMjA1LTc0LjAwNjUyOCAyMi40NTMzODVMMzYxLjg0NjE4OCAyNTUuMjk1NDU0Yy00Mi4wMjIwNjkgMC42MDc4NDQtNDIuMDIyMDY5IDAuNjA3ODQ0LTQyLjAyMjA2OS0yMi40NTMzODVsMC0xNy44MzkyOTdjMC00OC4wNjA1OTkgMjUuOTczNTU4LTg3LjAyMDkzNiA1OC4wMTQyOTgtODcuMDIwOTM2bDI2Ny43MzQ3NjQgMGMzMi4wNDA3NCAwIDU4LjAxNDI5OCAzOC45NjAzMzcgNTguMDE0Mjk4IDg3LjAyMDkzNkw3MDMuNTg3NDggMjMyLjg0MjA2OXoiIHAtaWQ9IjEzMjgyIiBmaWxsPSIjZDgxZTA2Ij48L3BhdGg+PHBhdGggZD0iTTY4OC43NTM2MzMgMzE5Ljg2MzAwNSAzMzQuNjU3OTY2IDMxOS44NjMwMDVjLTE0LjgzMzg0NyAwLTc4Ljc5NDU3NyAwLTc4Ljc5NDU3NyAwbDAgNTExLjY4NDgyMmMwIDQzLjUxNzExOSAzNS4yNzc0NTggNjMuOTYwNzMxIDc4Ljc5NDU3NyA2My45NjA3MzFsMzU0LjA5NTY2NyAwYzQzLjUxNzExOSAwIDc4Ljc5NDU3Ny0yMC40NDM2MTEgNzguNzk0NTc3LTYzLjk2MDczMUw3NjcuNTQ4MjEgMzE5Ljg2MzAwNUM3NjcuNTQ4MjEgMzE5Ljg2MzAwNSA3MzIuMjcwNzUyIDMxOS44NjMwMDUgNjg4Ljc1MzYzMyAzMTkuODYzMDA1ek00NDcuNzQ1NTggNzY3LjU4ODExOSAzODMuNzg0ODUgNzY3LjU4ODExOSAzODMuNzg0ODUgNDQ3Ljc4NDQ2Nmw2My45NjA3MzEgMEw0NDcuNzQ1NTggNzY3LjU4ODExOXpNNjM5LjYyNzc3MiA3NjcuNTg4MTE5bC02My45NjA3MzEgMEw1NzUuNjY3MDQyIDQ0Ny43ODQ0NjZsNjMuOTYwNzMxIDBMNjM5LjYyNzc3MiA3NjcuNTg4MTE5eiIgcC1pZD0iMTMyODMiIGZpbGw9IiNkODFlMDYiPjwvcGF0aD48L3N2Zz4="); +} + .typecho-access-logs-pagination { list-style: none; float: right; diff --git a/page/routes/logs/index.js b/page/routes/logs/index.js index af54241..1b6e0a8 100644 --- a/page/routes/logs/index.js +++ b/page/routes/logs/index.js @@ -15,6 +15,7 @@ $(document).ready(function () { ua: $('[name="filter-ua"]').val(), ip: $('[name="filter-ip"]').val(), cid: $('[name="filter-cid"]').val(), + url: $('[name="filter-url"]').val(), path: $('[name="filter-path"]').val(), robot: $('[name="filter-robot"]').val(), preset: $('[name="filter-preset"]').val(), @@ -26,6 +27,7 @@ $(document).ready(function () { $('[name="filter-ua"]').val('ua' in filters ? filters.ua : ''); $('[name="filter-ip"]').val('ip' in filters ? filters.ip : ''); $('[name="filter-cid"]').val('cid' in filters ? filters.cid : ''); + $('[name="filter-url"]').val('url' in filters ? filters.url : ''); $('[name="filter-path"]').val('path' in filters ? filters.path : ''); $('[name="filter-robot"]').val('robot' in filters ? filters.robot : ''); $('[name="filter-preset"]').val('preset' in filters ? filters.preset : ''); @@ -96,28 +98,91 @@ $(document).ready(function () { $tr.append($td); // url $td = $(''); - $td.append($('', { - class: '', - 'data-action': 'search-anchor', - 'data-filter': JSON.stringify({ path: item.path }), - }).text(item.url.replace(/%23/u, '#'))); + $td.append( + $('
', { class: 'typecho-access-logs-list-cell' }) + .append( + $('', { + class: 'typecho-access-logs-list-cell-item', + href: item.url, + target: '__blank', + }).text(item.url.replace(/%23/u, '#')) + ) + .append( + $('', { + class: 'typecho-access-logs-list-cell-item typecho-access-logs-list-cell-item-icon typecho-access-logs-list-cell-item-search', + 'data-action': 'search-anchor', + 'data-filter': JSON.stringify({ path: item.path }), + 'data-auto-hide': 'yes', + }).hide() + ) + .append( + $('', { + class: 'typecho-access-logs-list-cell-item typecho-access-logs-list-cell-item-icon typecho-access-logs-list-cell-item-delete', + 'data-action': 'quick-filter-delete', + 'data-filter': JSON.stringify({ url: item.url }), + 'data-auto-hide': 'yes', + }).hide() + ) + ); $tr.append($td); // ua $td = $(''); - $td.append($('', { - title: item.ua, - class: '', - 'data-action': 'search-anchor', - 'data-filter': JSON.stringify({ ua: item.ua }), - }).text(item.display_name)); + $td.append( + $('
', { class: 'typecho-access-logs-list-cell' }) + .append( + $('', { + title: item.ua, + class: 'typecho-access-logs-list-cell-item', + 'data-action': 'ua-information', + 'data-ua': item.ua, + }).text(item.display_name) + ) + .append( + $('', { + class: 'typecho-access-logs-list-cell-item typecho-access-logs-list-cell-item-icon typecho-access-logs-list-cell-item-search', + 'data-action': 'search-anchor', + 'data-filter': JSON.stringify({ ua: item.ua }), + 'data-auto-hide': 'yes', + }).hide() + ) + .append( + $('', { + class: 'typecho-access-logs-list-cell-item typecho-access-logs-list-cell-item-icon typecho-access-logs-list-cell-item-delete', + 'data-action': 'quick-filter-delete', + 'data-filter': JSON.stringify({ ua: item.ua }), + 'data-auto-hide': 'yes', + }).hide() + ) + ); $tr.append($td); // ip $td = $(''); - $td.append($('', { - class: '', - 'data-action': 'search-anchor', - 'data-filter': JSON.stringify({ ip: item.ip }), - }).text(item.ip)); + $td.append( + $('
', { class: 'typecho-access-logs-list-cell' }) + .append( + $('', { + class: 'typecho-access-logs-list-cell-item', + 'data-action': 'ip-information', + 'data-ip-information': item.ip + '\n\n' + item.ip_country + ' ' + item.ip_loc, + }).text(item.ip) + ) + .append( + $('', { + class: 'typecho-access-logs-list-cell-item typecho-access-logs-list-cell-item-icon typecho-access-logs-list-cell-item-search', + 'data-action': 'search-anchor', + 'data-filter': JSON.stringify({ ip: item.ip }), + 'data-auto-hide': 'yes', + }).hide() + ) + .append( + $('', { + class: 'typecho-access-logs-list-cell-item typecho-access-logs-list-cell-item-icon typecho-access-logs-list-cell-item-delete', + 'data-action': 'quick-filter-delete', + 'data-filter': JSON.stringify({ ip: item.ip }), + 'data-auto-hide': 'yes', + }).hide() + ) + ); $tr.append($td); // ip_loc $td = $(''); @@ -125,11 +190,7 @@ $(document).ready(function () { $tr.append($td); // referer $td = $(''); - $td.append($('', { - class: '', - 'data-action': 'search-anchor', - 'data-filter': JSON.stringify({ referer: item.referer }), - }).text(item.referer)); + $td.append($('').text(item.referer)); $tr.append($td); // time $td = $(''); @@ -142,7 +203,46 @@ $(document).ready(function () { $tbody.html('
暂无数据
'); } $('.typecho-access-logs-list-checkbox').change(updateSelectAll); - $('a[data-action="search-anchor"]').click(onSearchAnchorClick); + $('[data-action="search-anchor"]').click(onSearchAnchorClick); + $('.typecho-access-logs-list-cell').hover( + function() { + $(this).find('[data-auto-hide="yes"]').show(); + }, + function() { + $(this).find('[data-auto-hide="yes"]').hide(); + } + ); + $('[data-action="quick-filter-delete"]').click(function(e) { + var text = ''; + var filters = JSON.parse(e.target.getAttribute('data-filter')); + if (filters.url) { + text = '本次操作将删除符合以下受访地址的记录,你确认要删除这些记录吗?\n\n' + filters.url; + } else if (filters.ua) { + text = '本次操作将删除符合以下UA的记录,你确认要删除这些记录吗?\n\n' + filters.ua; + } else if (filters.ip) { + text = '本次操作将删除符合以下IP地址的记录,你确认要删除这些记录吗?\n\n' + filters.ip; + } + swal({ + title: "你确定?", + text: text, + icon: "warning", + buttons: { + cancel: "算啦", + confirm: "是的", + }, + }).then((value) => { + if (value === true) { + deleteLogs(filters); + } + }); + }); + $('[data-action="ua-information"]').click(function(e) { + swal('User-Agent', e.target.getAttribute('data-ua'), 'info'); + }); + $('[data-action="ip-information"]').click(function(e) { + swal('IP 信息', e.target.getAttribute('data-ip-information'), 'info'); + }); + updateSelectAll(); // logs pagination @@ -269,7 +369,7 @@ $(document).ready(function () { $('[name="filter-fuzzy"]').change(function(e) { var filters = getFilters(); - var inputKeys = ['ua', 'ip', 'path']; + var inputKeys = ['ua', 'ip', 'url', 'path']; if (e.target.value === '1') { $(inputKeys).each(function(_, k) { if (filters[k] === '') { diff --git a/page/routes/logs/index.php b/page/routes/logs/index.php index 974cff0..5aa012a 100644 --- a/page/routes/logs/index.php +++ b/page/routes/logs/index.php @@ -45,6 +45,10 @@
+
+ + +