Initial implementation of the HomeSysPanel CMS built with Laravel 13.0. Includes complete admin panel, content management, user authentication, modular architecture for products/services/chatbot, and marketing tools. Key features: - User authentication with email verification and password reset - Role-based access control (Admin/User with granular permissions) - Content management (pages, news, FAQ, downloads, galleries, banners) - Contact management system with subjects and responses - Marketing tools (email campaigns, visitor analytics, social sharing) - Modular architecture (Products, Services, Chatbot modules) - AI Chatbot integration with OpenRouter.ai and LlamaCpp support - Visitor tracking with geolocation - SEO optimization with meta tags and Open Graph - Responsive design with Bootstrap 5 - Dark mode support - Maintenance mode - Feature request system
57 lines
2.1 KiB
PHP
Executable File
57 lines
2.1 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\VisitorLog;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class TrackVisitor
|
|
{
|
|
public function handle(Request $request, Closure $next)
|
|
{
|
|
// Só rastreia requisições GET e que não sejam administrativas ou de sistema
|
|
if ($request->isMethod('GET') && !$request->is('admin*') && !$request->is('login') && !$request->is('logout')) {
|
|
|
|
$ip = $request->ip();
|
|
$sessionId = session()->getId();
|
|
|
|
// Tenta obter localização do cache para não sobrecarregar a API nem atrasar o site
|
|
$location = Cache::remember('visitor_location_' . $ip, now()->addDays(7), function () use ($ip) {
|
|
try {
|
|
// Usando ip-api.com (serviço gratuito limitado)
|
|
$response = Http::timeout(3)->get("http://ip-api.com/json/{$ip}?fields=status,country,city,regionName");
|
|
|
|
if ($response->successful() && $response->json('status') === 'success') {
|
|
return $response->json();
|
|
}
|
|
} catch (\Exception $e) {
|
|
Log::warning("Erro ao rastrear localização do IP {$ip}: " . $e->getMessage());
|
|
}
|
|
|
|
return [
|
|
'country' => 'Desconhecido',
|
|
'city' => 'Desconhecido',
|
|
'regionName' => 'Desconhecido'
|
|
];
|
|
});
|
|
|
|
// Registra o log
|
|
VisitorLog::create([
|
|
'ip_address' => $ip,
|
|
'country' => $location['country'] ?? 'Desconhecido',
|
|
'city' => $location['city'] ?? 'Desconhecido',
|
|
'region' => $location['regionName'] ?? 'Desconhecido',
|
|
'session_id' => $sessionId,
|
|
'user_agent' => $request->userAgent(),
|
|
'page_url' => $request->fullUrl()
|
|
]);
|
|
}
|
|
|
|
return $next($request);
|
|
}
|
|
}
|