feat(cms): implement complete SysSiteCMS content management system
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
This commit is contained in:
Executable
+56
@@ -0,0 +1,56 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user