class LogAccess{ constructor(props) { this.dataTable = null; // Lưu reference đến DataTable instance } //tải danh sách các ISP để hiển thị trong dropdown filter loadIspForFilter(){ let token = $("meta[name='csrf-token']").attr("content"); $.ajax({ url: '/logaccess/unique-isp-list', type: 'GET', data: {_token: token}, success: function (response) { let select = $('#ispFilter'); select.empty(); select.append(''); response.isps.forEach(function(isp) { // Thêm count vào option text với format số có dấu phẩy let countFormatted = isp.count.toLocaleString(); select.append(''); }); }, error: function (xhr) { console.log(xhr.responseText); } }); } //tải danh sách các ISP để hiển thị trong dropdown filter loadIspForFilter(){ let token = $("meta[name='csrf-token']").attr("content"); $.ajax({ url: '/logaccess/unique-isp-list', type: 'GET', data: {_token: token}, success: function (response) { let select = $('#ispFilter'); select.empty(); select.append(''); response.isps.forEach(function(isp) { // Thêm count vào option text với format số có dấu phẩy let countFormatted = isp.count.toLocaleString(); select.append(''); }); }, error: function (xhr) { console.log(xhr.responseText); } }); } //tải danh sách các nước để hiển thị trong dropdown filter loadCountriesForFilter(){ let token = $("meta[name='csrf-token']").attr("content"); $.ajax({ url: '/logaccess/unique-countries-list', type: 'GET', data: {_token: token}, success: function (response) { let select = $('#countryFilter'); select.empty(); select.append(''); response.countries.forEach(function(country) { // Thêm count vào option text với format số có dấu phẩy let countFormatted = country.count.toLocaleString(); select.append(''); }); }, error: function (xhr) { console.log(xhr.responseText); } }); } //đếm số lượng quốc gia truy cập totalCountriesCount(){ let token = $("meta[name='csrf-token']").attr("content"); $.ajax({ url: '/logaccess/unique-countries', type: 'GET', data: {_token: token}, success: function (response) { $('#totalCountriesCount').text(response.unique_countries_count); }, error: function (xhr) { console.log(xhr.responseText); } }); } //thống kê truy cập theo từng quốc gia totalCountries(){ let token = $("meta[name='csrf-token']").attr("content"); new DataTable('#totalCountries', { debug:true, processing: true, serverSide: true, ajax: { data:{_token:token}, url: '/logaccess/country-statistics', type: 'GET', "dataSrc": function(json) { return json.data; // đảm bảo dữ liệu của bạn nằm trong mảng `data` } }, columns: [ {data: 'country'}, {data: 'count'}, ], columnDefs: [ { targets: 0, className: 'tdCenter', }, { targets: 1, className: 'tdCenter', }, ] }); } totalIpStatistics(){ let token = $("meta[name='csrf-token']").attr("content"); let self = this; this.dataTable = new DataTable('#totalIpStatistics', { debug:true, processing: true, serverSide: true, ajax: { data: function(d) { d._token = token; d.country_filter = $('#countryFilter').val(); // Thêm filter cho quốc gia d.isp_filter = $('#ispFilter').val(); // Thêm filter cho ISP d.min_access_filter = $('#minAccessFilter').val(); // Thêm filter cho số lần truy cập tối thiểu d.from_date_filter = $('#fromDateFilter').val(); // Thêm filter cho ngày bắt đầu d.to_date_filter = $('#toDateFilter').val(); // Thêm filter cho ngày kết thúc return d; }, url: '/logaccess/ip-statistics', type: 'GET', "dataSrc": function(json) { return json.data; } }, columns: [ {data: 'ip', title: 'IP Address'}, {data: 'count', title: 'Requests'}, {data: 'domain', title: 'Domain'}, {data: 'location', title: 'Location'}, {data: 'country', title: 'Country'}, {data: 'asn_organization', title: 'ISP/Organization'}, {data: 'first_access', title: 'First Access'}, {data: 'last_access', title: 'Last Access'}, ], columnDefs: [ { targets: [0, 1, 2, 3, 4], className: 'tdCenter', }, ], order: [[1, 'desc']] // Sort by count descending }); } //đếm số lượng truy cập theo ip ipStatistics(){ let token = $("meta[name='csrf-token']").attr("content"); new DataTable('#ipStatistics', { debug:true, processing: true, serverSide: true, ajax: { data:{_token:token}, url: '/logaccess/ip-statistics', type: 'GET', "dataSrc": function(json) { return json.data; // đảm bảo dữ liệu của bạn nằm trong mảng `data` } }, columns: [ {data: 'ip'}, {data: 'count'}, ], columnDefs: [ { targets: 0, className: 'tdCenter', }, { targets: 1, className: 'tdCenter', }, ] }); } // Xuất dữ liệu thành CSV exportData() { let token = $("meta[name='csrf-token']").attr("content"); // Lấy các giá trị filter hiện tại let filters = { _token: token, country_filter: $('#countryFilter').val(), isp_filter: $('#ispFilter').val(), min_access_filter: $('#minAccessFilter').val(), from_date_filter: $('#fromDateFilter').val(), to_date_filter: $('#toDateFilter').val(), export: true }; // Tạo URL với các tham số filter let queryString = $.param(filters); let exportUrl = '/logaccess/export-ip-statistics?' + queryString; // Tải file window.open(exportUrl, '_blank'); } // Xóa tất cả bộ lọc clearAllFilters() { $('#countryFilter').val(''); $('#ispFilter').val(''); $('#minAccessFilter').val(''); $('#fromDateFilter').val(''); $('#toDateFilter').val(''); // Reload datatable if (this.dataTable) { this.dataTable.ajax.reload(); } } } $(function () { let logAccess = new LogAccess(); logAccess.totalCountriesCount(); logAccess.totalCountries(); logAccess.totalIpStatistics(); logAccess.loadCountriesForFilter(); logAccess.loadIspForFilter(); // Event listener cho dropdown filter quốc gia $('#countryFilter').on('change', function() { if (logAccess.dataTable) { logAccess.dataTable.ajax.reload(); // Reload data với filter mới } }); // Event listener cho dropdown filter ISP $('#ispFilter').on('change', function() { if (logAccess.dataTable) { logAccess.dataTable.ajax.reload(); } }); // Event listener cho input số lần truy cập tối thiểu $('#minAccessFilter').on('keyup', function() { if (logAccess.dataTable) { logAccess.dataTable.ajax.reload(); } }); // Event listener cho date filter từ ngày $('#fromDateFilter').on('change', function() { if (logAccess.dataTable) { logAccess.dataTable.ajax.reload(); } }); // Event listener cho date filter đến ngày $('#toDateFilter').on('change', function() { if (logAccess.dataTable) { logAccess.dataTable.ajax.reload(); } }); // Event listener cho button áp dụng bộ lọc $('#applyFiltersBtn').on('click', function() { if (logAccess.dataTable) { logAccess.dataTable.ajax.reload(); } }); // Event listener cho button xóa bộ lọc $('#clearFiltersBtn').on('click', function() { logAccess.clearAllFilters(); }); // Event listener cho button xuất dữ liệu $('#exportDataBtn').on('click', function() { logAccess.exportData(); }); });