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
+201
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use App\Http\Controllers\PageController;
|
||||
use App\Http\Controllers\HomeController;
|
||||
use App\Http\Controllers\ProfileController;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Redirect;
|
||||
|
||||
// Rotas Institucionais (Públicas Fixas)
|
||||
Route::get('/', [PageController::class, 'index'])->name('index');
|
||||
Route::get('/sobre', [PageController::class, 'about'])->name('about');
|
||||
// Note: /produtos route is registered by the Products module when enabled
|
||||
// Note: /servicos route is registered by the Services module when enabled
|
||||
Route::get('/assistentes-digitais-com-ia', [PageController::class, 'assistentesDigitaisIA'])->name('assistentes-digitais-ia');
|
||||
Route::get('/linux-servers', [PageController::class, 'servidoresLinux'])->name('servidores-linux');
|
||||
Route::get('/erp', [PageController::class, 'erp'])->name('erp');
|
||||
Route::get('/fluxo-de-caixa-pro', [PageController::class, 'fluxoDeCaixaPro'])->name('fluxo-de-caixa-pro');
|
||||
Route::get('/downloads', [PageController::class, 'downloads'])->name('downloads');
|
||||
Route::get('/downloads/{download}', [PageController::class, 'downloadFile'])->name('downloads.file')->middleware(['auth', 'verified']);
|
||||
Route::get('/galerias/categoria/{slug}', [PageController::class, 'galleryCategory'])->name('gallery.category');
|
||||
Route::get('/galeria/{slug}', [PageController::class, 'gallery'])->name('gallery.show');
|
||||
Route::get('/noticias', [PageController::class, 'newsIndex'])->name('news.index');
|
||||
Route::get('/noticias/{slug}', [PageController::class, 'newsShow'])->name('news.show');
|
||||
Route::get('/faq', [PageController::class, 'faq'])->name('faq');
|
||||
Route::get('/contato', [PageController::class, 'contato'])->name('contato');
|
||||
Route::post('/contato', [PageController::class, 'sendContact'])
|
||||
->middleware('throttle:5,1')
|
||||
->name('contato.send');
|
||||
Route::get('/politica-privacidade', [PageController::class, 'politicaPrivacidade'])->name('politica-privacidade');
|
||||
|
||||
// Rotas de Autenticação (Login, Registro, Recuperação, Verificação)
|
||||
Auth::routes(['verify' => true, 'register' => true]);
|
||||
|
||||
// Dashboard (Protegido)
|
||||
Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::get('/home', [HomeController::class, 'index'])->name('home');
|
||||
Route::post('/home/feature-request', [HomeController::class, 'sendFeatureRequest'])->name('home.feature.request');
|
||||
|
||||
// Perfil e Preferências
|
||||
Route::get('/perfil', [ProfileController::class, 'edit'])->name('profile.edit');
|
||||
Route::put('/perfil', [ProfileController::class, 'update'])->name('profile.update');
|
||||
Route::get('/preferencias', [ProfileController::class, 'preferences'])->name('profile.preferences');
|
||||
Route::put('/preferencias', [ProfileController::class, 'updatePreferences'])->name('profile.preferences.update');
|
||||
});
|
||||
|
||||
// Área Administrativa (Apenas Admin)
|
||||
Route::middleware(['auth', 'verified', 'admin'])->prefix('admin')->name('admin.')->group(function () {
|
||||
// Gerenciamento de Usuários (Somente Admin)
|
||||
Route::get('/usuarios', [App\Http\Controllers\Admin\UserController::class, 'index'])->name('users.index');
|
||||
Route::get('/usuarios/criar', [App\Http\Controllers\Admin\UserController::class, 'create'])->name('users.create');
|
||||
Route::post('/usuarios', [App\Http\Controllers\Admin\UserController::class, 'store'])->name('users.store');
|
||||
Route::get('/usuarios/{user}/editar', [App\Http\Controllers\Admin\UserController::class, 'edit'])->name('users.edit');
|
||||
Route::put('/usuarios/{user}', [App\Http\Controllers\Admin\UserController::class, 'update'])->name('users.update');
|
||||
Route::delete('/usuarios/{user}', [App\Http\Controllers\Admin\UserController::class, 'destroy'])->name('users.destroy');
|
||||
|
||||
// Gerenciamento de Tipos de Usuário (Somente Admin)
|
||||
Route::get('/tipos-de-usuario', [App\Http\Controllers\Admin\UserTypeController::class, 'index'])->name('user-types.index');
|
||||
Route::get('/tipos-de-usuario/criar', [App\Http\Controllers\Admin\UserTypeController::class, 'create'])->name('user-types.create');
|
||||
Route::post('/tipos-de-usuario', [App\Http\Controllers\Admin\UserTypeController::class, 'store'])->name('user-types.store');
|
||||
Route::get('/tipos-de-usuario/{userType}/editar', [App\Http\Controllers\Admin\UserTypeController::class, 'edit'])->name('user-types.edit');
|
||||
Route::put('/tipos-de-usuario/{userType}', [App\Http\Controllers\Admin\UserTypeController::class, 'update'])->name('user-types.update');
|
||||
Route::delete('/tipos-de-usuario/{userType}', [App\Http\Controllers\Admin\UserTypeController::class, 'destroy'])->name('user-types.destroy');
|
||||
});
|
||||
|
||||
// Área Administrativa (Admin e User com permissões específicas)
|
||||
Route::middleware(['auth', 'verified'])->prefix('admin')->name('admin.')->group(function () {
|
||||
|
||||
// Gerenciamento de Contatos (permissão: contacts)
|
||||
Route::middleware('permission:contacts')->group(function () {
|
||||
Route::get('/contatos', [App\Http\Controllers\Admin\ContactController::class, 'index'])->name('contacts.index');
|
||||
Route::get('/contatos/{contact}', [App\Http\Controllers\Admin\ContactController::class, 'show'])->name('contacts.show');
|
||||
Route::post('/contatos/{contact}/responder', [App\Http\Controllers\Admin\ContactController::class, 'reply'])->name('contacts.reply');
|
||||
Route::delete('/contatos/{contact}', [App\Http\Controllers\Admin\ContactController::class, 'destroy'])->name('contacts.destroy');
|
||||
});
|
||||
|
||||
// Gerenciamento de Assuntos (permissão: subjects)
|
||||
Route::middleware('permission:subjects')->group(function () {
|
||||
Route::get('/assuntos', [App\Http\Controllers\Admin\SubjectController::class, 'index'])->name('subjects.index');
|
||||
Route::get('/assuntos/criar', [App\Http\Controllers\Admin\SubjectController::class, 'create'])->name('subjects.create');
|
||||
Route::post('/assuntos', [App\Http\Controllers\Admin\SubjectController::class, 'store'])->name('subjects.store');
|
||||
Route::get('/assuntos/{subject}/editar', [App\Http\Controllers\Admin\SubjectController::class, 'edit'])->name('subjects.edit');
|
||||
Route::put('/assuntos/{subject}', [App\Http\Controllers\Admin\SubjectController::class, 'update'])->name('subjects.update');
|
||||
Route::delete('/assuntos/{subject}', [App\Http\Controllers\Admin\SubjectController::class, 'destroy'])->name('subjects.destroy');
|
||||
});
|
||||
|
||||
// Gerenciamento de Páginas (permissão: pages)
|
||||
Route::middleware('permission:pages')->group(function () {
|
||||
Route::get('/paginas', [App\Http\Controllers\Admin\PageController::class, 'index'])->name('pages.index');
|
||||
Route::get('/paginas/criar', [App\Http\Controllers\Admin\PageController::class, 'create'])->name('pages.create');
|
||||
Route::post('/paginas', [App\Http\Controllers\Admin\PageController::class, 'store'])->name('pages.store');
|
||||
Route::get('/paginas/{page}/editar', [App\Http\Controllers\Admin\PageController::class, 'edit'])->name('pages.edit');
|
||||
Route::put('/paginas/{page}', [App\Http\Controllers\Admin\PageController::class, 'update'])->name('pages.update');
|
||||
Route::delete('/paginas/{page}', [App\Http\Controllers\Admin\PageController::class, 'destroy'])->name('pages.destroy');
|
||||
});
|
||||
|
||||
// Gerenciamento de FAQ (permissão: faqs)
|
||||
Route::middleware('permission:faqs')->group(function () {
|
||||
Route::get('/faq', [App\Http\Controllers\Admin\FaqController::class, 'index'])->name('faqs.index');
|
||||
Route::get('/faq/criar', [App\Http\Controllers\Admin\FaqController::class, 'create'])->name('faqs.create');
|
||||
Route::post('/faq', [App\Http\Controllers\Admin\FaqController::class, 'store'])->name('faqs.store');
|
||||
Route::get('/faq/{faq}/editar', [App\Http\Controllers\Admin\FaqController::class, 'edit'])->name('faqs.edit');
|
||||
Route::put('/faq/{faq}', [App\Http\Controllers\Admin\FaqController::class, 'update'])->name('faqs.update');
|
||||
Route::delete('/faq/{faq}', [App\Http\Controllers\Admin\FaqController::class, 'destroy'])->name('faqs.destroy');
|
||||
});
|
||||
|
||||
// Note: Products routes are registered by the Products module when enabled
|
||||
// Note: Services routes are registered by the Services module when enabled
|
||||
|
||||
// Gerenciamento de Notícias (permissão: news)
|
||||
Route::middleware('permission:news')->group(function () {
|
||||
Route::get('/noticias', [App\Http\Controllers\Admin\NewsController::class, 'index'])->name('news.index');
|
||||
Route::post('/noticias/toggle-visibilidade', [App\Http\Controllers\Admin\NewsController::class, 'toggleVisibility'])->name('news.toggle');
|
||||
Route::get('/noticias/criar', [App\Http\Controllers\Admin\NewsController::class, 'create'])->name('news.create');
|
||||
Route::post('/noticias', [App\Http\Controllers\Admin\NewsController::class, 'store'])->name('news.store');
|
||||
Route::get('/noticias/{news}/editar', [App\Http\Controllers\Admin\NewsController::class, 'edit'])->name('news.edit');
|
||||
Route::put('/noticias/{news}', [App\Http\Controllers\Admin\NewsController::class, 'update'])->name('news.update');
|
||||
Route::delete('/noticias/{news}', [App\Http\Controllers\Admin\NewsController::class, 'destroy'])->name('news.destroy');
|
||||
Route::delete('/noticias/{news}/imagem-principal', [App\Http\Controllers\Admin\NewsController::class, 'removeFeaturedImage'])->name('news.remove-featured');
|
||||
Route::post('/noticias/{news}/imagem', [App\Http\Controllers\Admin\NewsController::class, 'uploadImage'])->name('news.upload');
|
||||
Route::put('/noticias/imagem/{image}', [App\Http\Controllers\Admin\NewsController::class, 'updateImage'])->name('news.image.update');
|
||||
Route::delete('/noticias/imagem/{image}', [App\Http\Controllers\Admin\NewsController::class, 'deleteImage'])->name('news.image.delete');
|
||||
});
|
||||
|
||||
// Gerenciamento de Downloads (permissão: downloads)
|
||||
Route::middleware('permission:downloads')->group(function () {
|
||||
Route::get('/downloads', [App\Http\Controllers\Admin\DownloadController::class, 'index'])->name('downloads.index');
|
||||
Route::get('/downloads/criar', [App\Http\Controllers\Admin\DownloadController::class, 'create'])->name('downloads.create');
|
||||
Route::post('/downloads', [App\Http\Controllers\Admin\DownloadController::class, 'store'])->name('downloads.store');
|
||||
Route::get('/downloads/{download}/editar', [App\Http\Controllers\Admin\DownloadController::class, 'edit'])->name('downloads.edit');
|
||||
Route::put('/downloads/{download}', [App\Http\Controllers\Admin\DownloadController::class, 'update'])->name('downloads.update');
|
||||
Route::delete('/downloads/{download}', [App\Http\Controllers\Admin\DownloadController::class, 'destroy'])->name('downloads.destroy');
|
||||
});
|
||||
|
||||
// Gerenciamento de Galerias (permissão: galleries)
|
||||
Route::middleware('permission:galleries')->group(function () {
|
||||
Route::get('/galerias', [App\Http\Controllers\Admin\GalleryController::class, 'index'])->name('galleries.index');
|
||||
Route::get('/galerias/criar', [App\Http\Controllers\Admin\GalleryController::class, 'create'])->name('galleries.create');
|
||||
Route::post('/galerias', [App\Http\Controllers\Admin\GalleryController::class, 'store'])->name('galleries.store');
|
||||
Route::get('/galerias/{gallery}/editar', [App\Http\Controllers\Admin\GalleryController::class, 'edit'])->name('galleries.edit');
|
||||
Route::put('/galerias/{gallery}', [App\Http\Controllers\Admin\GalleryController::class, 'update'])->name('galleries.update');
|
||||
Route::delete('/galerias/{gallery}', [App\Http\Controllers\Admin\GalleryController::class, 'destroy'])->name('galleries.destroy');
|
||||
Route::post('/galerias/{gallery}/imagem', [App\Http\Controllers\Admin\GalleryController::class, 'uploadImage'])->name('galleries.upload');
|
||||
Route::put('/galerias/imagem/{image}', [App\Http\Controllers\Admin\GalleryController::class, 'updateImage'])->name('galleries.image.update');
|
||||
Route::delete('/galerias/imagem/{image}', [App\Http\Controllers\Admin\GalleryController::class, 'deleteImage'])->name('galleries.image.delete');
|
||||
|
||||
// Categorias de Galerias
|
||||
Route::get('/galerias/categorias', [App\Http\Controllers\Admin\GalleryCategoryController::class, 'index'])->name('gallery-categories.index');
|
||||
Route::get('/galerias/categorias/criar', [App\Http\Controllers\Admin\GalleryCategoryController::class, 'create'])->name('gallery-categories.create');
|
||||
Route::post('/galerias/categorias', [App\Http\Controllers\Admin\GalleryCategoryController::class, 'store'])->name('gallery-categories.store');
|
||||
Route::get('/galerias/categorias/{galleryCategory}/editar', [App\Http\Controllers\Admin\GalleryCategoryController::class, 'edit'])->name('gallery-categories.edit');
|
||||
Route::put('/galerias/categorias/{galleryCategory}', [App\Http\Controllers\Admin\GalleryCategoryController::class, 'update'])->name('gallery-categories.update');
|
||||
Route::delete('/galerias/categorias/{galleryCategory}', [App\Http\Controllers\Admin\GalleryCategoryController::class, 'destroy'])->name('gallery-categories.destroy');
|
||||
});
|
||||
|
||||
// Área de Marketing (permissão: marketing)
|
||||
Route::middleware('permission:marketing')->prefix('marketing')->name('marketing.')->group(function () {
|
||||
Route::get('/', [App\Http\Controllers\Admin\MarketingController::class, 'index'])->name('index');
|
||||
Route::get('/visitantes', [App\Http\Controllers\Admin\MarketingController::class, 'analytics'])->name('analytics');
|
||||
Route::get('/promover-produtos', [App\Http\Controllers\Admin\MarketingController::class, 'promoteProducts'])->name('promote.products');
|
||||
Route::get('/promover-servicos', [App\Http\Controllers\Admin\MarketingController::class, 'promoteServices'])->name('promote.services');
|
||||
Route::get('/email-marketing', [App\Http\Controllers\Admin\MarketingController::class, 'emailMarketing'])->name('email');
|
||||
Route::post('/email-marketing', [App\Http\Controllers\Admin\MarketingController::class, 'sendEmailMarketing'])->name('email.send');
|
||||
|
||||
// Gerenciamento de Banners (Destaques)
|
||||
Route::resource('banners', App\Http\Controllers\Admin\BannerController::class);
|
||||
});
|
||||
|
||||
// Configurações e SEO Global (permissão: settings)
|
||||
Route::middleware('permission:settings')->group(function () {
|
||||
Route::get('/configuracoes', [App\Http\Controllers\Admin\SettingController::class, 'index'])->name('settings.index');
|
||||
Route::post('/configuracoes', [App\Http\Controllers\Admin\SettingController::class, 'update'])->name('settings.update');
|
||||
});
|
||||
|
||||
// ERP Syspanel Advertisement (available to all logged-in users)
|
||||
Route::get('/erp-syspanel', [App\Http\Controllers\Admin\SettingController::class, 'erpAd'])->name('erp.ad');
|
||||
|
||||
// Manual de Uso (available to all logged-in users)
|
||||
Route::get('/manual-de-uso', function () {
|
||||
return view('admin.manual.index');
|
||||
})->name('manual');
|
||||
|
||||
// Notificações (available to all logged-in users)
|
||||
Route::get('/notificacoes/{id}/lida', function ($id) {
|
||||
/** @var \App\Models\User $user */
|
||||
$user = Auth::user();
|
||||
$notification = $user->notifications()->findOrFail($id);
|
||||
$notification->markAsRead();
|
||||
return Redirect::to($notification->data['link']);
|
||||
})->name('notifications.read');
|
||||
|
||||
Route::get('/notificacoes/limpar', function () {
|
||||
/** @var \App\Models\User $user */
|
||||
$user = Auth::user();
|
||||
$user->unreadNotifications->markAsRead();
|
||||
return Redirect::back();
|
||||
})->name('notifications.clear');
|
||||
});
|
||||
|
||||
// Rota Dinâmica para Páginas Customizadas (DEVE SER SEMPRE A ÚLTIMA ROTA)
|
||||
Route::get('/{slug}', [PageController::class, 'show'])->name('pages.show');
|
||||
Reference in New Issue
Block a user