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
+26
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
|
||||
class AdminUserSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
User::updateOrCreate(
|
||||
['email' => 'admin@admin.com'],
|
||||
[
|
||||
'name' => 'Administrador',
|
||||
'password' => Hash::make('admin123'),
|
||||
'user_type' => 'Admin',
|
||||
'email_verified_at' => now(),
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
Executable
+57
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\ContactMessage;
|
||||
use App\Models\ContactSubject;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class ContactMessageSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$subjects = ContactSubject::all();
|
||||
|
||||
if ($subjects->isEmpty()) {
|
||||
$this->call(ContactSubjectSeeder::class);
|
||||
$subjects = ContactSubject::all();
|
||||
}
|
||||
|
||||
$names = [
|
||||
'Ricardo Oliveira', 'Mariana Santos', 'Carlos Eduardo', 'Ana Beatriz',
|
||||
'Fernando Souza', 'Juliana Lima', 'Marcos Rocha', 'Patrícia Gomes',
|
||||
'Luiz Henrique', 'Sofia Almeida'
|
||||
];
|
||||
|
||||
$messages = [
|
||||
'Gostaria de um orçamento para manutenção de 5 computadores na minha empresa.',
|
||||
'Vocês têm notebooks da marca Dell em estoque? Qual o valor médio?',
|
||||
'Estou precisando de uma placa de vídeo específica para jogos, vocês trabalham com encomendas?',
|
||||
'Meu computador não liga mais após uma queda de energia. Vocês fazem busca em domicílio?',
|
||||
'Quais os horários disponíveis para uma visita técnica nesta semana?',
|
||||
'Gostaria de saber se vocês fazem instalação de redes cabeadas para escritórios.',
|
||||
'Preciso formatar meu notebook e fazer backup de arquivos importantes.',
|
||||
'Vocês vendem licenças originais do Windows e Office?',
|
||||
'Meu teclado parou de funcionar algumas teclas, vocês fazem a troca?',
|
||||
'Gostaria de informações sobre o plano de manutenção mensal para empresas.'
|
||||
];
|
||||
|
||||
foreach ($names as $index => $name) {
|
||||
ContactMessage::create([
|
||||
'name' => $name,
|
||||
'email' => Str::lower(Str::slug($name)) . '@exemplo.com',
|
||||
'company' => $index % 2 == 0 ? 'Empresa ' . ($index + 1) : null,
|
||||
'website' => $index % 3 == 0 ? 'https://empresa' . ($index + 1) . '.com.br' : null,
|
||||
'whatsapp' => '(11) 9' . rand(7000, 9999) . '-' . rand(1000, 9999),
|
||||
'subject_id' => $subjects->random()->id,
|
||||
'message' => $messages[$index],
|
||||
'read' => rand(0, 1),
|
||||
'created_at' => now()->subDays(rand(0, 30))->subHours(rand(0, 23)),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\ContactSubject;
|
||||
|
||||
class ContactSubjectSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$subjects = [
|
||||
'Orçamento de Manutenção',
|
||||
'Compra de Notebook',
|
||||
'Peças e Acessórios',
|
||||
'Suporte Técnico',
|
||||
'Outros'
|
||||
];
|
||||
|
||||
foreach ($subjects as $name) {
|
||||
ContactSubject::updateOrCreate(['name' => $name]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class DatabaseSeeder extends Seeder
|
||||
{
|
||||
use WithoutModelEvents;
|
||||
|
||||
/**
|
||||
* Seed the application's database.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$this->call([
|
||||
AdminUserSeeder::class,
|
||||
ContactSubjectSeeder::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
Executable
+42
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\Faq;
|
||||
|
||||
class FaqSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$faqs = [
|
||||
[
|
||||
'question' => 'Qual o prazo médio para manutenção de notebooks?',
|
||||
'answer' => 'O prazo médio é de 2 a 5 dias úteis, dependendo da complexidade do reparo e da disponibilidade de peças.',
|
||||
'order' => 1,
|
||||
],
|
||||
[
|
||||
'question' => 'Vocês oferecem garantia nos serviços?',
|
||||
'answer' => 'Sim, todos os nossos serviços possuem garantia de 90 dias, conforme o Código de Defesa do Consumidor.',
|
||||
'order' => 2,
|
||||
],
|
||||
[
|
||||
'question' => 'Fazem orçamento sem compromisso?',
|
||||
'answer' => 'Sim! Realizamos a avaliação técnica inicial sem custo para o cliente.',
|
||||
'order' => 3,
|
||||
],
|
||||
[
|
||||
'question' => 'Trabalham com retirada e entrega?',
|
||||
'answer' => 'Sim, possuímos serviço de leva e traz para sua maior comodidade em toda a região central.',
|
||||
'order' => 4,
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($faqs as $faq) {
|
||||
Faq::updateOrCreate(['question' => $faq['question']], $faq);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+187
@@ -0,0 +1,187 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Models\Page;
|
||||
|
||||
class PageSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$pages = [
|
||||
[
|
||||
'slug' => 'index',
|
||||
'title' => 'Início',
|
||||
'meta_description' => 'Bem-vindo à Syspanel - Tecnologia com Confiança.',
|
||||
'content' => '
|
||||
<section class="text-center mb-5">
|
||||
<h1 class="display-3 fw-bold mb-4 text-primary">Tecnologia com Confiança</h1>
|
||||
<p class="lead mb-5 fs-4 text-muted">Manutenção especializada de computadores, notebooks e venda de acessórios com as melhores marcas.</p>
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center">
|
||||
<a href="/servicos" class="btn btn-primary btn-lg px-5 py-3 me-md-2 fw-bold rounded-pill">Nossos Serviços</a>
|
||||
<a href="/produtos" class="btn btn-outline-primary btn-lg px-5 py-3 rounded-pill">Ver Produtos</a>
|
||||
</div>
|
||||
</section>
|
||||
<div class="row g-4 text-center mt-5">
|
||||
<div class="col-md-4">
|
||||
<div class="p-4 border rounded shadow-sm h-100 bg-white">
|
||||
<i class="bi bi-tools fs-1 text-primary mb-3"></i>
|
||||
<h3 class="h4 mb-3">Manutenção</h3>
|
||||
<p class="text-muted">Especialistas em notebooks e desktops de todas as marcas.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="p-4 border rounded shadow-sm h-100 bg-white">
|
||||
<i class="bi bi-cart-check fs-1 text-primary mb-3"></i>
|
||||
<h3 class="h4 mb-3">Vendas</h3>
|
||||
<p class="text-muted">Notebooks novos e seminovos revisados com garantia.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="p-4 border rounded shadow-sm h-100 bg-white">
|
||||
<i class="bi bi-shield-check fs-1 text-primary mb-3"></i>
|
||||
<h3 class="h4 mb-3">Confiança</h3>
|
||||
<p class="text-muted">Transparência total em orçamentos e peças originais.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
',
|
||||
],
|
||||
[
|
||||
'slug' => 'about',
|
||||
'title' => 'Sobre Nós',
|
||||
'meta_description' => 'Conheça a história e os valores da Syspanel.',
|
||||
'content' => '
|
||||
<div class="row align-items-center g-5">
|
||||
<div class="col-lg-6">
|
||||
<img src="https://images.unsplash.com/photo-1597733336794-12d05021d510?ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80" alt="Equipe" class="img-fluid rounded shadow-lg">
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<h2 class="display-5 fw-bold mb-4">Syspanel: Sua parceira em tecnologia</h2>
|
||||
<p class="lead mb-4 text-muted">Há mais de 10 anos no mercado, somos referência em soluções de informática.</p>
|
||||
<p>Nascemos da paixão pela tecnologia e da necessidade de oferecer um serviço de manutenção transparente e qualificado.</p>
|
||||
</div>
|
||||
</div>
|
||||
',
|
||||
],
|
||||
[
|
||||
'slug' => 'produtos',
|
||||
'title' => 'Produtos',
|
||||
'meta_description' => 'Confira nossa linha de produtos e acessórios.',
|
||||
'content' => '
|
||||
<h2 class="display-4 fw-bold text-center mb-5 text-primary">Produtos em Destaque</h2>
|
||||
<div class="row g-4">
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100 shadow-sm border-0 bg-white text-center p-3">
|
||||
<h5 class="fw-bold">Notebooks Novos</h5>
|
||||
<p class="text-muted">As melhores marcas do mercado.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100 shadow-sm border-0 bg-white text-center p-3">
|
||||
<h5 class="fw-bold">Acessórios</h5>
|
||||
<p class="text-muted">Periféricos de alta qualidade.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card h-100 shadow-sm border-0 bg-white text-center p-3">
|
||||
<h5 class="fw-bold">Peças</h5>
|
||||
<p class="text-muted">Upgrades e reposição.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
',
|
||||
],
|
||||
[
|
||||
'slug' => 'servicos',
|
||||
'title' => 'Serviços',
|
||||
'meta_description' => 'Conheça nossos serviços de manutenção e consultoria.',
|
||||
'content' => '
|
||||
<h2 class="display-4 fw-bold text-center mb-5">O que podemos fazer por você?</h2>
|
||||
<div class="row g-4">
|
||||
<div class="col-md-6">
|
||||
<div class="p-4 border rounded bg-white">
|
||||
<h4 class="text-primary fw-bold">Manutenção de Notebooks</h4>
|
||||
<p>Troca de telas, baterias e reparos em placa-mãe.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="p-4 border rounded bg-white">
|
||||
<h4 class="text-primary fw-bold">Computadores e Redes</h4>
|
||||
<p>Upgrade de hardware e configuração de redes Wi-Fi.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
',
|
||||
],
|
||||
[
|
||||
'slug' => 'assistentes-digitais-com-ia',
|
||||
'title' => 'Assistentes Digitais com IA',
|
||||
'meta_description' => 'Descubra como os assistentes digitais com IA podem transformar sua empresa.',
|
||||
'content' => 'Conteúdo dinâmico em assistentes-digitais-ia.blade.php',
|
||||
],
|
||||
[
|
||||
'slug' => 'linux-servers',
|
||||
'title' => 'Servidores Linux',
|
||||
'meta_description' => 'Implantação de servidores Linux robustos, seguros e de alta performance para sua empresa.',
|
||||
'content' => 'Conteúdo dinâmico em servidores-linux.blade.php',
|
||||
],
|
||||
[
|
||||
'slug' => 'erp',
|
||||
'title' => 'ERP Syspanel',
|
||||
'meta_description' => 'Descubra como o ERP Syspanel pode transformar a gestão da sua empresa com módulos personalizados e inteligência artificial.',
|
||||
'content' => 'Conteúdo dinâmico em erp.blade.php',
|
||||
],
|
||||
[
|
||||
'slug' => 'fluxo-de-caixa-pro',
|
||||
'title' => 'Fluxo de Caixa Pro',
|
||||
'meta_description' => 'Domine as finanças da sua empresa com o Fluxo de Caixa Pro. Controle total, DRE automático, IA financeira e acesso de qualquer lugar.',
|
||||
'content' => 'Conteúdo dinâmico em fluxo-de-caixa-pro.blade.php',
|
||||
],
|
||||
[
|
||||
'slug' => 'downloads',
|
||||
'title' => 'Downloads',
|
||||
'meta_description' => 'Baixe drivers e utilitários úteis.',
|
||||
'content' => '
|
||||
<h2 class="display-4 fw-bold text-center mb-5 text-primary">Downloads Recomendados</h2>
|
||||
<div class="list-group">
|
||||
<a href="https://anydesk.com" target="_blank" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
|
||||
AnyDesk Support
|
||||
<span class="badge bg-primary rounded-pill">Baixar</span>
|
||||
</a>
|
||||
<a href="https://cpuid.com" target="_blank" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
|
||||
CPU-Z (Hardware)
|
||||
<span class="badge bg-success rounded-pill">Acessar</span>
|
||||
</a>
|
||||
</div>
|
||||
',
|
||||
],
|
||||
[
|
||||
'slug' => 'contato',
|
||||
'title' => 'Contato',
|
||||
'meta_description' => 'Fale conosco para orçamentos e suporte técnico.',
|
||||
'content' => null,
|
||||
],
|
||||
[
|
||||
'slug' => 'faq',
|
||||
'title' => 'FAQ',
|
||||
'meta_description' => 'Perguntas frequentes sobre nossos serviços.',
|
||||
'content' => null,
|
||||
],
|
||||
[
|
||||
'slug' => 'politica-privacidade',
|
||||
'title' => 'Política de Privacidade',
|
||||
'meta_description' => 'Conheça nossos termos de uso e política de privacidade em conformidade com a LGPD.',
|
||||
'content' => 'Conteúdo dinâmico em politica-privacidade.blade.php',
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($pages as $page) {
|
||||
Page::updateOrCreate(['slug' => $page['slug']], $page);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+25
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Modules\Products\Models\ProductCategory;
|
||||
|
||||
class ProductCategorySeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$categories = [
|
||||
['name' => 'Notebooks', 'slug' => 'notebooks', 'active' => true, 'order' => 1],
|
||||
['name' => 'Acessórios', 'slug' => 'acessorios', 'active' => true, 'order' => 2],
|
||||
['name' => 'Peças', 'slug' => 'pecas', 'active' => true, 'order' => 3],
|
||||
];
|
||||
|
||||
foreach ($categories as $category) {
|
||||
ProductCategory::updateOrCreate(['slug' => $category['slug']], $category);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+70
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use App\Modules\Services\Models\Service;
|
||||
|
||||
class ServiceSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$services = [
|
||||
[
|
||||
'name' => 'Manutenção de Notebooks',
|
||||
'slug' => 'manutencao-notebooks',
|
||||
'description' => 'Reparo especializado em hardware, troca de telas, teclados e baterias.',
|
||||
'icon' => 'bi bi-laptop',
|
||||
'active' => true,
|
||||
'order' => 1
|
||||
],
|
||||
[
|
||||
'name' => 'Redes e Wi-Fi',
|
||||
'slug' => 'redes-wifi',
|
||||
'description' => 'Configuração de roteadores, repetidores e infraestrutura de rede cabeada.',
|
||||
'icon' => 'bi bi-wifi',
|
||||
'active' => true,
|
||||
'order' => 2
|
||||
],
|
||||
[
|
||||
'name' => 'Limpeza Preventiva',
|
||||
'slug' => 'limpeza-preventiva',
|
||||
'description' => 'Limpeza interna completa e troca de pasta térmica para evitar superaquecimento.',
|
||||
'icon' => 'bi bi-wind',
|
||||
'active' => true,
|
||||
'order' => 3
|
||||
],
|
||||
[
|
||||
'name' => 'Servidores Linux',
|
||||
'slug' => 'servidores-linux',
|
||||
'description' => 'Implantação e configuração de servidores Linux em infraestrutura local ou nuvem com alta disponibilidade.',
|
||||
'icon' => 'bi bi-hdd-network',
|
||||
'active' => true,
|
||||
'order' => 4
|
||||
],
|
||||
[
|
||||
'name' => 'Assistentes Digitais com IA',
|
||||
'slug' => 'assistentes-digitais-ia',
|
||||
'description' => 'Implantação de assistentes digitais inteligentes com IA para automatizar atendimento e processos internos.',
|
||||
'icon' => 'bi bi-robot',
|
||||
'active' => true,
|
||||
'order' => 5
|
||||
],
|
||||
[
|
||||
'name' => 'Registro de Marcas no INPI',
|
||||
'slug' => 'registro-marcas-inpi',
|
||||
'description' => 'Proteção legal da sua marca junto ao INPI, garantindo exclusividade de uso em todo território nacional.',
|
||||
'icon' => 'bi bi-shield-check',
|
||||
'active' => true,
|
||||
'order' => 6
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($services as $service) {
|
||||
Service::updateOrCreate(['slug' => $service['slug']], $service);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user