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
+6
@@ -0,0 +1,6 @@
|
||||
/* @import 'tailwindcss'; */
|
||||
|
||||
/* @theme {
|
||||
--font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
|
||||
'Segoe UI Symbol', 'Noto Color Emoji';
|
||||
} */
|
||||
Executable
+1
@@ -0,0 +1 @@
|
||||
import './bootstrap';
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
import 'bootstrap';
|
||||
|
||||
/**
|
||||
* We'll load the axios HTTP library which allows us to easily issue requests
|
||||
* to our Laravel back-end. This library automatically handles sending the
|
||||
* CSRF token as a header based on the value of the "XSRF" token cookie.
|
||||
*/
|
||||
|
||||
import axios from 'axios';
|
||||
window.axios = axios;
|
||||
|
||||
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
||||
|
||||
/**
|
||||
* Echo exposes an expressive API for subscribing to channels and listening
|
||||
* for events that are broadcast by Laravel. Echo and event broadcasting
|
||||
* allows your team to easily build robust real-time web applications.
|
||||
*/
|
||||
|
||||
// import Echo from 'laravel-echo';
|
||||
|
||||
// import Pusher from 'pusher-js';
|
||||
// window.Pusher = Pusher;
|
||||
|
||||
// window.Echo = new Echo({
|
||||
// broadcaster: 'pusher',
|
||||
// key: import.meta.env.VITE_PUSHER_APP_KEY,
|
||||
// cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1',
|
||||
// wsHost: import.meta.env.VITE_PUSHER_HOST ?? `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,
|
||||
// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,
|
||||
// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,
|
||||
// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',
|
||||
// enabledTransports: ['ws', 'wss'],
|
||||
// });
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
// Body
|
||||
$body-bg: #f8fafc;
|
||||
|
||||
// Typography
|
||||
$font-family-sans-serif: 'Nunito', sans-serif;
|
||||
$font-size-base: 0.9rem;
|
||||
$line-height-base: 1.6;
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
// Fonts
|
||||
@import url('https://fonts.bunny.net/css?family=Nunito');
|
||||
|
||||
// Variables
|
||||
@import 'variables';
|
||||
|
||||
// Bootstrap
|
||||
@import 'bootstrap/scss/bootstrap';
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title)
|
||||
@section('meta_description', $page->meta_description)
|
||||
@section('meta_keywords', $page->meta_keywords)
|
||||
@section('og_title', $page->og_title)
|
||||
@section('og_description', $page->og_description)
|
||||
@section('og_image', $page->og_image)
|
||||
@section('canonical', $page->canonical_url)
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
{!! $page->content !!}
|
||||
</div>
|
||||
@endsection
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Novo Banner')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Cadastrar Banner</h1>
|
||||
<a href="{{ route('admin.marketing.banners.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações do Banner</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.marketing.banners.store') }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título do Banner (Aparecerá no Carrossel)</label>
|
||||
<input type="text" name="title" class="form-control @error('title') is-invalid @enderror" value="{{ old('title') }}" required>
|
||||
@error('title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Link (Opcional)</label>
|
||||
<input type="url" name="link" class="form-control @error('link') is-invalid @enderror" value="{{ old('link') }}" placeholder="Ex: https://syspanel.com.br/promo">
|
||||
@error('link') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Texto do Botão (Ex: Saiba Mais)</label>
|
||||
<input type="text" name="button_text" class="form-control @error('button_text') is-invalid @enderror" value="{{ old('button_text') }}">
|
||||
@error('button_text') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Imagem do Banner</label>
|
||||
<input type="file" name="image" class="form-control-file @error('image') is-invalid @enderror" required>
|
||||
<small class="text-muted d-block mt-2">Recomendado: 1920x600px para melhor visualização.</small>
|
||||
@error('image') <div class="invalid-feedback d-block">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Ordem</label>
|
||||
<input type="number" name="order" class="form-control @error('order') is-invalid @enderror" value="{{ old('order', 0) }}" required>
|
||||
@error('order') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ old('active', '1') == '1' ? 'selected' : '' }}>Ativo</option>
|
||||
<option value="0" {{ old('active') == '0' ? 'selected' : '' }}>Inativo</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Banner
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+87
@@ -0,0 +1,87 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Banner')
|
||||
|
||||
@section('content')
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb mb-4">
|
||||
<li class="breadcrumb-item"><a href="{{ route('home') }}">Dashboard</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ route('admin.marketing.banners.index') }}">Marketing</a></li>
|
||||
<li class="breadcrumb-item"><a href="{{ route('admin.marketing.banners.index') }}">Banners</a></li>
|
||||
<li class="breadcrumb-item active">Editar Banner</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar Banner: {{ $banner->title }}</h1>
|
||||
<a href="{{ route('admin.marketing.banners.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações do Banner</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.marketing.banners.update', $banner) }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título do Banner (Aparecerá no Carrossel)</label>
|
||||
<input type="text" name="title" class="form-control @error('title') is-invalid @enderror" value="{{ old('title', $banner->title) }}" required>
|
||||
@error('title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Link (Opcional)</label>
|
||||
<input type="url" name="link" class="form-control @error('link') is-invalid @enderror" value="{{ old('link', $banner->link) }}" placeholder="Ex: https://syspanel.com.br/promo">
|
||||
@error('link') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Texto do Botão (Ex: Saiba Mais)</label>
|
||||
<input type="text" name="button_text" class="form-control @error('button_text') is-invalid @enderror" value="{{ old('button_text', $banner->button_text) }}">
|
||||
@error('button_text') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Imagem do Banner</label>
|
||||
@if($banner->image)
|
||||
<div class="mb-2">
|
||||
<img src="{{ asset('storage/' . $banner->image) }}" class="img-thumbnail" style="height: 100px;">
|
||||
</div>
|
||||
@endif
|
||||
<input type="file" name="image" class="form-control-file @error('image') is-invalid @enderror">
|
||||
<small class="text-muted d-block mt-2">Deixe em branco para manter a imagem atual.</small>
|
||||
@error('image') <div class="invalid-feedback d-block">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Ordem</label>
|
||||
<input type="number" name="order" class="form-control @error('order') is-invalid @enderror" value="{{ old('order', $banner->order) }}" required>
|
||||
@error('order') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ old('active', $banner->active) == '1' ? 'selected' : '' }}>Ativo</option>
|
||||
<option value="0" {{ old('active', $banner->active) == '0' ? 'selected' : '' }}>Inativo</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Alterações
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Gerenciar Banners')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Gerenciar Banners (Destaques)</h1>
|
||||
<a href="{{ route('admin.marketing.banners.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Novo Banner
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Banners Ativos e Inativos</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="50">Ordem</th>
|
||||
<th width="200">Banner</th>
|
||||
<th>Título</th>
|
||||
<th>Botão / Link</th>
|
||||
<th>Status</th>
|
||||
<th width="120">Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($banners as $banner)
|
||||
<tr>
|
||||
<td>{{ $banner->order }}</td>
|
||||
<td>
|
||||
<img src="{{ asset('storage/' . $banner->image) }}" class="img-fluid rounded" style="max-height: 60px;">
|
||||
</td>
|
||||
<td>{{ $banner->title }}</td>
|
||||
<td>
|
||||
@if($banner->button_text)
|
||||
<span class="badge badge-primary">{{ $banner->button_text }}</span>
|
||||
@endif
|
||||
<br>
|
||||
<small class="text-muted">{{ $banner->link ?: 'Sem link' }}</small>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-{{ $banner->active ? 'success' : 'secondary' }}">
|
||||
{{ $banner->active ? 'Ativo' : 'Inativo' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.marketing.banners.edit', $banner) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<form action="{{ route('admin.marketing.banners.destroy', $banner) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Excluir este banner?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="6" class="text-center">Nenhum banner encontrado.</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
{{ $banners->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Mensagens de Contato')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Contatos Recebidos</h1>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Mensagens</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Status</th>
|
||||
<th>Data</th>
|
||||
<th>Nome</th>
|
||||
<th>Assunto</th>
|
||||
<th>WhatsApp</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($contacts as $contact)
|
||||
<tr class="{{ $contact->read ? 'text-muted' : 'font-weight-bold bg-light' }}">
|
||||
<td class="text-center">
|
||||
@if($contact->read)
|
||||
<i class="bi bi-envelope-open text-secondary" title="Lida"></i>
|
||||
@else
|
||||
<i class="bi bi-envelope-fill text-primary" title="Nova!"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ $contact->created_at->format('d/m/Y H:i') }}</td>
|
||||
<td>{{ $contact->name }}</td>
|
||||
<td>{{ $contact->subject->name ?? 'N/A' }}</td>
|
||||
<td>{{ $contact->whatsapp ?? '-' }}</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.contacts.show', $contact) }}" class="btn btn-sm btn-info">
|
||||
<i class="bi bi-eye"></i>
|
||||
</a>
|
||||
<form action="{{ route('admin.contacts.destroy', $contact) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Tem certeza que deseja excluir esta mensagem?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
{{ $contacts->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Detalhes do Contato')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Mensagem de {{ $contact->name }}</h1>
|
||||
<a href="{{ route('admin.contacts.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-7">
|
||||
<!-- Detalhes da Mensagem -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3 d-flex justify-content-between align-items-center">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Conteúdo da Solicitação</h6>
|
||||
<span class="text-muted small">{{ $contact->created_at->format('d/m/Y \à\s H:i') }}</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6">
|
||||
<p class="mb-1 text-muted small text-uppercase fw-bold">Nome</p>
|
||||
<p class="h5">{{ $contact->name }}</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p class="mb-1 text-muted small text-uppercase fw-bold">E-mail</p>
|
||||
<p class="h5"><a href="mailto:{{ $contact->email }}">{{ $contact->email }}</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-4">
|
||||
<p class="mb-1 text-muted small text-uppercase fw-bold">Empresa</p>
|
||||
<p>{{ $contact->company ?? 'Não informada' }}</p>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<p class="mb-1 text-muted small text-uppercase fw-bold">Site</p>
|
||||
<p>
|
||||
@if($contact->website)
|
||||
<a href="{{ $contact->website }}" target="_blank">{{ $contact->website }}</a>
|
||||
@else
|
||||
Não informado
|
||||
@endif
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<p class="mb-1 text-muted small text-uppercase fw-bold">WhatsApp</p>
|
||||
<p>
|
||||
@if($contact->whatsapp)
|
||||
<a href="https://wa.me/{{ preg_replace('/[^0-9]/', '', $contact->whatsapp) }}" target="_blank" class="text-success fw-bold">
|
||||
<i class="bi bi-whatsapp"></i> {{ $contact->whatsapp }}
|
||||
</a>
|
||||
@else
|
||||
Não informado
|
||||
@endif
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-12">
|
||||
<p class="mb-1 text-muted small text-uppercase fw-bold">Assunto</p>
|
||||
<p class="badge badge-primary px-3 py-2" style="font-size: 1rem;">{{ $contact->subject->name ?? 'Geral' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="row mt-4">
|
||||
<div class="col-md-12">
|
||||
<p class="mb-2 text-muted small text-uppercase fw-bold">Mensagem do Cliente</p>
|
||||
<div class="bg-light p-4 rounded border" style="white-space: pre-wrap; min-height: 150px; font-size: 1.1rem;">{{ $contact->message }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Histórico de Respostas -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3 bg-light">
|
||||
<h6 class="m-0 font-weight-bold text-dark"><i class="bi bi-clock-history me-1"></i> Histórico de Respostas</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@forelse($contact->responses as $response)
|
||||
<div class="mb-4 pb-3 border-bottom">
|
||||
<div class="d-flex justify-content-between mb-2">
|
||||
<span class="font-weight-bold text-primary">{{ $response->user->name }}</span>
|
||||
<span class="text-muted small">{{ $response->created_at->format('d/m/Y H:i') }}</span>
|
||||
</div>
|
||||
<div class="bg-white p-3 rounded border shadow-sm">
|
||||
{{ $response->message }}
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<p class="text-center text-muted py-4">Nenhuma resposta enviada ainda.</p>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-5">
|
||||
<!-- Formulário de Resposta -->
|
||||
<div class="card shadow mb-4 border-left-primary">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-reply me-1"></i> Enviar Resposta</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.contacts.reply', $contact) }}" method="POST">
|
||||
@csrf
|
||||
<div class="form-group mb-4">
|
||||
<label class="font-weight-bold text-dark">Sua Mensagem</label>
|
||||
<textarea name="message" class="form-control @error('message') is-invalid @enderror" rows="10" placeholder="Escreva aqui a resposta para o cliente..." required>{{ old('message') }}</textarea>
|
||||
@error('message') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<small class="text-muted d-block mt-2">Esta mensagem será enviada para <strong>{{ $contact->email }}</strong>.</small>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-send me-1"></i> Enviar por E-mail
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Ações Adicionais -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-body">
|
||||
@if($contact->whatsapp)
|
||||
<a href="https://wa.me/{{ preg_replace('/[^0-9]/', '', $contact->whatsapp) }}" target="_blank" class="btn btn-success btn-block mb-3 py-2 fw-bold">
|
||||
<i class="bi bi-whatsapp me-1"></i> Chamar no WhatsApp
|
||||
</a>
|
||||
@endif
|
||||
|
||||
<form action="{{ route('admin.contacts.destroy', $contact) }}" method="POST">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-outline-danger btn-block" onclick="return confirm('Excluir esta mensagem permanentemente?')">
|
||||
<i class="bi bi-trash me-1"></i> Excluir Registro do Sistema
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Novo Download')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Novo Download</h1>
|
||||
<a href="{{ route('admin.downloads.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Upload de Arquivo</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.downloads.store') }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título do Download</label>
|
||||
<input type="text" name="title" class="form-control @error('title') is-invalid @enderror" value="{{ old('title') }}" required placeholder="Ex: Driver Wi-Fi Notebook X">
|
||||
@error('title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição</label>
|
||||
<textarea name="description" class="form-control @error('description') is-invalid @enderror" rows="3">{{ old('description') }}</textarea>
|
||||
@error('description') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Tipo de Arquivo</label>
|
||||
<select name="file_type" class="form-control @error('file_type') is-invalid @enderror" required>
|
||||
<option value="Driver">Driver</option>
|
||||
<option value="Manual">Manual</option>
|
||||
<option value="Software">Software</option>
|
||||
<option value="Outro">Outro</option>
|
||||
</select>
|
||||
@error('file_type') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Arquivo (Máx 20MB)</label>
|
||||
<input type="file" name="file" class="form-control-file @error('file') is-invalid @enderror" required>
|
||||
@error('file') <div class="invalid-feedback d-block">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-upload me-1"></i> Fazer Upload e Salvar
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Download')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar Download</h1>
|
||||
<a href="{{ route('admin.downloads.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações do Arquivo</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.downloads.update', $download) }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título do Download</label>
|
||||
<input type="text" name="title" class="form-control @error('title') is-invalid @enderror" value="{{ old('title', $download->title) }}" required>
|
||||
@error('title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição</label>
|
||||
<textarea name="description" class="form-control @error('description') is-invalid @enderror" rows="3">{{ old('description', $download->description) }}</textarea>
|
||||
@error('description') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Tipo de Arquivo</label>
|
||||
<select name="file_type" class="form-control @error('file_type') is-invalid @enderror" required>
|
||||
<option value="Driver" {{ $download->file_type == 'Driver' ? 'selected' : '' }}>Driver</option>
|
||||
<option value="Manual" {{ $download->file_type == 'Manual' ? 'selected' : '' }}>Manual</option>
|
||||
<option value="Software" {{ $download->file_type == 'Software' ? 'selected' : '' }}>Software</option>
|
||||
<option value="Outro" {{ $download->file_type == 'Outro' ? 'selected' : '' }}>Outro</option>
|
||||
</select>
|
||||
@error('file_type') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Substituir Arquivo (Opcional)</label>
|
||||
<input type="file" name="file" class="form-control-file @error('file') is-invalid @enderror">
|
||||
<small class="text-muted d-block">Deixe em branco para manter o arquivo atual.</small>
|
||||
@error('file') <div class="invalid-feedback d-block">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ $download->active ? 'selected' : '' }}>Ativo (Visível)</option>
|
||||
<option value="0" {{ !$download->active ? 'selected' : '' }}>Inativo (Oculto)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Alterações
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Gerenciar Downloads')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Gerenciamento de Downloads</h1>
|
||||
<a href="{{ route('admin.downloads.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Novo Download
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Arquivos Disponíveis</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Título</th>
|
||||
<th>Tipo</th>
|
||||
<th>Status</th>
|
||||
<th>Baixado</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($downloads as $download)
|
||||
<tr>
|
||||
<td>{{ $download->title }}</td>
|
||||
<td><span class="badge badge-secondary">{{ $download->file_type }}</span></td>
|
||||
<td>
|
||||
<span class="badge badge-{{ $download->active ? 'success' : 'secondary' }}">
|
||||
{{ $download->active ? 'Ativo' : 'Inativo' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ $download->download_count }} vezes</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.downloads.edit', $download) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<form action="{{ route('admin.downloads.destroy', $download) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Excluir este arquivo?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
{{ $downloads->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+240
@@ -0,0 +1,240 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Conheça o ERP Syspanel')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid">
|
||||
<!-- Header de Propaganda -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-12">
|
||||
<div class="card bg-gradient-primary text-white shadow">
|
||||
<div class="card-body p-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-8">
|
||||
<h1 class="display-4 fw-bold">Potencialize sua Empresa com o ERP Syspanel</h1>
|
||||
<p class="lead mb-4">A solução completa e inteligente para a gestão total do seu negócio. Do financeiro à Inteligência Artificial, tudo em um só lugar.</p>
|
||||
<a href="https://syspanel.com.br" target="_blank" class="btn btn-light btn-lg px-5 py-3 rounded-pill fw-bold text-primary shadow-sm">
|
||||
<i class="bi bi-rocket me-2"></i>Assine Agora o ERP Syspanel
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-lg-4 d-none d-lg-block text-center">
|
||||
<i class="bi bi-graph-up opacity-25"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Título da Seção de Módulos -->
|
||||
<div class="text-center mb-5">
|
||||
<h2 class="h3 text-gray-800 font-weight-bold">Módulos Especializados para seu Crescimento</h2>
|
||||
<div class="dropdown-divider w-25 mx-auto border-primary"></div>
|
||||
</div>
|
||||
|
||||
<!-- Grid de Módulos -->
|
||||
<div class="row g-4">
|
||||
<!-- Módulo 1 -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-primary shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-primary text-uppercase mb-1">Módulo ERP</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Financeiro</div>
|
||||
<p class="text-muted small mt-2">Gestão de contas a pagar, receber e movimentações bancárias em tempo real.</p>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-cash-stack text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Módulo 2 -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-success shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-success text-uppercase mb-1">Módulo ERP</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">CRM</div>
|
||||
<p class="text-muted small mt-2">Relacionamento completo: Leads, Oportunidades, Atividades e Pipelines de venda.</p>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-persons text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Módulo 3 -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-info shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">Módulo ERP</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Gestão de Projetos</div>
|
||||
<p class="text-muted small mt-2">Organize tarefas e prazos com metodologia Kanban e controle de produtividade.</p>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-list-task text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Módulo 4 -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-warning shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-warning text-uppercase mb-1">Módulo ERP</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Estoque e Matérias-Primas</div>
|
||||
<p class="text-muted small mt-2">Controle total de insumos, matérias-primas e armazéns com inteligência.</p>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-boxes text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Módulo IA -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-danger shadow h-100 py-2 bg-light">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-danger text-uppercase mb-1">Módulo IA</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Agente de IA ERP</div>
|
||||
<p class="text-muted small mt-2">Analise seus dados em tempo real com um agente inteligente exclusivo.</p>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-robot text-danger opacity-50"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Módulo 6 -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-secondary shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-secondary text-uppercase mb-1">Módulo ERP</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Produção (PCP)</div>
|
||||
<p class="text-muted small mt-2">Planejamento e controle rigoroso da produção e engenharia de produto (BOM).</p>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-gears text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Módulo 7 -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-dark shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-dark text-uppercase mb-1">Módulo ERP</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Veículos e Frotas</div>
|
||||
<p class="text-muted small mt-2">Gestão de motoristas, ordens de serviço e manutenção de frotas da empresa.</p>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-truck text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Módulo 8 -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-info shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">Módulo ERP</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Gestão da Qualidade</div>
|
||||
<p class="text-muted small mt-2">Controle total de Manuais, Procedimentos e Formulários (SGQ).</p>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-check-circle text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mais Módulos Listados -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Outros Módulos Inclusos</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item"><i class="bi bi-check-lg text-success me-2"></i>RH (Recursos Humanos)</li>
|
||||
<li class="list-group-item"><i class="bi bi-check-lg text-success me-2"></i>Vendas ao Cliente</li>
|
||||
<li class="list-group-item"><i class="bi bi-check-lg text-success me-2"></i>Gestão de Fornecedores</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item"><i class="bi bi-check-lg text-success me-2"></i>Transportadoras e Fretes</li>
|
||||
<li class="list-group-item"><i class="bi bi-check-lg text-success me-2"></i>Service Tags</li>
|
||||
<li class="list-group-item"><i class="bi bi-check-lg text-success me-2"></i>Gerência Comercial</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item"><i class="bi bi-star text-warning me-2"></i>Plano de Negócios IA</li>
|
||||
<li class="list-group-item"><i class="bi bi-star text-warning me-2"></i>Assistente Local</li>
|
||||
<li class="list-group-item"><i class="bi bi-check-lg text-success me-2"></i>Gestão de Organogramas</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- CTA Final -->
|
||||
<div class="text-center py-5">
|
||||
<h3 class="font-weight-bold text-gray-800">Pronto para transformar sua gestão?</h3>
|
||||
<p class="lead text-muted mb-4">Junte-se a centenas de empresas que já utilizam o ecossistema Syspanel.</p>
|
||||
<a href="https://syspanel.com.br" target="_blank" class="btn btn-primary btn-lg px-5 shadow-lg fw-bold">
|
||||
Quero conhecer o ERP Syspanel agora!
|
||||
</a>
|
||||
<div class="mt-3">
|
||||
<small class="text-muted">Acesse <a href="https://syspanel.com.br" target="_blank">syspanel.com.br</a> para mais informações.</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('css')
|
||||
<style>
|
||||
.bg-gradient-primary {
|
||||
background: linear-gradient(135deg, #4e73df 0%, #224abe 100%);
|
||||
}
|
||||
.hover-scale {
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
.hover-scale:hover {
|
||||
transform: scale(1.02);
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Nova Pergunta FAQ')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Nova Pergunta FAQ</h1>
|
||||
<a href="{{ route('admin.faqs.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Criar Pergunta e Resposta</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.faqs.store') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Pergunta</label>
|
||||
<input type="text" name="question" class="form-control @error('question') is-invalid @enderror" value="{{ old('question') }}" required>
|
||||
@error('question') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Resposta</label>
|
||||
<textarea name="answer" class="form-control @error('answer') is-invalid @enderror" rows="5" required>{{ old('answer') }}</textarea>
|
||||
@error('answer') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Ordem de Exibição</label>
|
||||
<input type="number" name="order" class="form-control @error('order') is-invalid @enderror" value="{{ old('order', 0) }}" required>
|
||||
<small class="text-muted">Números menores aparecem primeiro.</small>
|
||||
@error('order') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Criar Pergunta
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+60
@@ -0,0 +1,60 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar FAQ')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar FAQ</h1>
|
||||
<a href="{{ route('admin.faqs.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Editar Pergunta e Resposta</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.faqs.update', $faq) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Pergunta</label>
|
||||
<input type="text" name="question" class="form-control @error('question') is-invalid @enderror" value="{{ old('question', $faq->question) }}" required>
|
||||
@error('question') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Resposta</label>
|
||||
<textarea name="answer" class="form-control @error('answer') is-invalid @enderror" rows="5" required>{{ old('answer', $faq->answer) }}</textarea>
|
||||
@error('answer') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Ordem de Exibição</label>
|
||||
<input type="number" name="order" class="form-control @error('order') is-invalid @enderror" value="{{ old('order', $faq->order) }}" required>
|
||||
@error('order') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ old('active', $faq->active) ? 'selected' : '' }}>Ativa</option>
|
||||
<option value="0" {{ old('active', $faq->active) ? '' : 'selected' }}>Inativa</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Alterações
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+64
@@ -0,0 +1,64 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Gerenciar FAQ')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Perguntas Frequentes (FAQ)</h1>
|
||||
<a href="{{ route('admin.faqs.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Nova Pergunta
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Perguntas</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Ordem</th>
|
||||
<th>Pergunta</th>
|
||||
<th>Status</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($faqs as $faq)
|
||||
<tr>
|
||||
<td>{{ $faq->order }}</td>
|
||||
<td>{{ $faq->question }}</td>
|
||||
<td>
|
||||
<span class="badge badge-{{ $faq->active ? 'success' : 'secondary' }}">
|
||||
{{ $faq->active ? 'Ativa' : 'Inativa' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.faqs.edit', $faq) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<form action="{{ route('admin.faqs.destroy', $faq) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Excluir esta pergunta?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
{{ $faqs->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Nova Galeria')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Criar Galeria</h1>
|
||||
<a href="{{ route('admin.galleries.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações Básicas</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.galleries.store') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Categoria</label>
|
||||
<select name="category_id" class="form-control">
|
||||
<option value="">Sem categoria</option>
|
||||
@foreach($categories as $category)
|
||||
<option value="{{ $category->id }}" {{ old('category_id') == $category->id ? 'selected' : '' }}>{{ $category->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título da Galeria</label>
|
||||
<input type="text" name="title" id="title" class="form-control @error('title') is-invalid @enderror" value="{{ old('title') }}" required placeholder="Ex: Nossos Serviços, Evento 2024">
|
||||
@error('title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Slug (URL)</label>
|
||||
<input type="text" name="slug" id="slug" class="form-control @error('slug') is-invalid @enderror" value="{{ old('slug') }}" required>
|
||||
@error('slug') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição (Opcional)</label>
|
||||
<textarea name="description" class="form-control" rows="3">{{ old('description') }}</textarea>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Criar Galeria e Adicionar Fotos
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
document.getElementById('title').addEventListener('keyup', function() {
|
||||
let text = this.value.toLowerCase()
|
||||
.normalize('NFD').replace(/[\u0300-\u036f]/g, "")
|
||||
.replace(/[^\w ]+/g, '')
|
||||
.replace(/ +/g, '-');
|
||||
document.getElementById('slug').value = text;
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
+124
@@ -0,0 +1,124 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Galeria')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Gerenciar Galeria: {{ $gallery->title }}</h1>
|
||||
<a href="{{ route('admin.galleries.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="row">
|
||||
<!-- Configurações da Galeria -->
|
||||
<div class="col-lg-4">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Configurações</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.galleries.update', $gallery) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Categoria</label>
|
||||
<select name="category_id" class="form-control">
|
||||
<option value="">Sem categoria</option>
|
||||
@foreach($categories as $category)
|
||||
<option value="{{ $category->id }}" {{ $gallery->category_id == $category->id ? 'selected' : '' }}>{{ $category->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Título</label>
|
||||
<input type="text" name="title" class="form-control" value="{{ $gallery->title }}" required>
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">URL (Slug)</label>
|
||||
<input type="text" name="slug" class="form-control" value="{{ $gallery->slug }}" required>
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Descrição</label>
|
||||
<textarea name="description" class="form-control" rows="3">{{ $gallery->description }}</textarea>
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ $gallery->active ? 'selected' : '' }}>Ativa</option>
|
||||
<option value="0" {{ !$gallery->active ? 'selected' : '' }}>Inativa</option>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block">Salvar Alterações</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Upload de Imagens -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3 bg-light">
|
||||
<h6 class="m-0 font-weight-bold text-dark">Adicionar Fotos</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.galleries.upload', $gallery) }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Selecionar Imagens</label>
|
||||
<input type="file" name="images[]" class="form-control-file" multiple accept="image/*" required>
|
||||
<small class="text-muted">Selecione uma ou mais imagens (máx. 5MB cada).</small>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-success btn-block">
|
||||
<i class="bi bi-upload me-1"></i> Enviar Fotos
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Lista de Imagens -->
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Fotos na Galeria</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
@forelse($gallery->images as $img)
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card h-100 border-0 shadow-sm overflow-hidden">
|
||||
<img src="{{ asset('storage/' . $img->file_path) }}" class="card-img-top" style="height: 150px; object-fit: cover;">
|
||||
<div class="card-body p-3">
|
||||
<form action="{{ route('admin.galleries.image.update', $img) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
<div class="form-group mb-2">
|
||||
<input type="text" name="description" class="form-control form-control-sm" value="{{ $img->description }}" placeholder="Descrição da imagem">
|
||||
</div>
|
||||
<div class="d-flex gap-2">
|
||||
<input type="number" name="order" class="form-control form-control-sm w-25" value="{{ $img->order }}" title="Ordem">
|
||||
<button type="submit" class="btn btn-sm btn-primary flex-grow-1">Salvar</button>
|
||||
</div>
|
||||
</form>
|
||||
<form action="{{ route('admin.galleries.image.delete', $img) }}" method="POST" class="mt-2">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-outline-danger btn-block" onclick="return confirm('Remover esta foto?')">Excluir</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<div class="col-12 text-center py-5">
|
||||
<p class="text-muted">Nenhuma foto adicionada ainda.</p>
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Gerenciar Galerias')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Galerias de Imagens</h1>
|
||||
<a href="{{ route('admin.galleries.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Nova Galeria
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Galerias</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Título</th>
|
||||
<th>Categoria</th>
|
||||
<th>URL (Slug)</th>
|
||||
<th>Imagens</th>
|
||||
<th>Status</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($galleries as $gallery)
|
||||
<tr>
|
||||
<td>{{ $gallery->title }}</td>
|
||||
<td>{{ $gallery->category?->name ?? '<span class="text-muted">—</span>' }}</td>
|
||||
<td><code>/galeria/{{ $gallery->slug }}</code></td>
|
||||
<td>{{ $gallery->images_count }} fotos</td>
|
||||
<td>
|
||||
<span class="badge badge-{{ $gallery->active ? 'success' : 'secondary' }}">
|
||||
{{ $gallery->active ? 'Ativa' : 'Inativa' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.galleries.edit', $gallery) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i> Gerenciar Fotos
|
||||
</a>
|
||||
<a href="{{ route('gallery.show', $gallery->slug) }}" target="_blank" class="btn btn-sm btn-info">
|
||||
<i class="bi bi-eye"></i> Ver
|
||||
</a>
|
||||
<form action="{{ route('admin.galleries.destroy', $gallery) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Excluir esta galeria e TODAS as suas fotos?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
{{ $galleries->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,57 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Nova Categoria de Galeria')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Criar Categoria</h1>
|
||||
<a href="{{ route('admin.gallery-categories.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações da Categoria</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.gallery-categories.store') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome da Categoria</label>
|
||||
<input type="text" name="name" id="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name') }}" required placeholder="Ex: Eventos, Projetos, Portfólio">
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Slug (URL)</label>
|
||||
<input type="text" name="slug" id="slug" class="form-control @error('slug') is-invalid @enderror" value="{{ old('slug') }}" required>
|
||||
@error('slug') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição (Opcional)</label>
|
||||
<textarea name="description" class="form-control" rows="3">{{ old('description') }}</textarea>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Criar Categoria
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
document.getElementById('name').addEventListener('keyup', function() {
|
||||
let text = this.value.toLowerCase()
|
||||
.normalize('NFD').replace(/[\u0300-\u036f]/g, "")
|
||||
.replace(/[^\w ]+/g, '')
|
||||
.replace(/ +/g, '-');
|
||||
document.getElementById('slug').value = text;
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Categoria de Galeria')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar Categoria: {{ $galleryCategory->name }}</h1>
|
||||
<a href="{{ route('admin.gallery-categories.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações da Categoria</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.gallery-categories.update', $galleryCategory) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome da Categoria</label>
|
||||
<input type="text" name="name" id="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name', $galleryCategory->name) }}" required>
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Slug (URL)</label>
|
||||
<input type="text" name="slug" id="slug" class="form-control @error('slug') is-invalid @enderror" value="{{ old('slug', $galleryCategory->slug) }}" required>
|
||||
@error('slug') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição (Opcional)</label>
|
||||
<textarea name="description" class="form-control" rows="3">{{ old('description', $galleryCategory->description) }}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ $galleryCategory->active ? 'selected' : '' }}>Ativa</option>
|
||||
<option value="0" {{ !$galleryCategory->active ? 'selected' : '' }}>Inativa</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Alterações
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,66 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Categorias de Galerias')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Categorias de Galerias</h1>
|
||||
<a href="{{ route('admin.gallery-categories.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Nova Categoria
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Categorias</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nome</th>
|
||||
<th>Slug</th>
|
||||
<th>Galerias</th>
|
||||
<th>Status</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($categories as $category)
|
||||
<tr>
|
||||
<td>{{ $category->name }}</td>
|
||||
<td><code>{{ $category->slug }}</code></td>
|
||||
<td>{{ $category->galleries_count }}</td>
|
||||
<td>
|
||||
<span class="badge badge-{{ $category->active ? 'success' : 'secondary' }}">
|
||||
{{ $category->active ? 'Ativa' : 'Inativa' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.gallery-categories.edit', $category) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<form action="{{ route('admin.gallery-categories.destroy', $category) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Excluir esta categoria? As galerias associadas não serão excluídas.')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
{{ $categories->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+601
@@ -0,0 +1,601 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Manual de Uso')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid px-4">
|
||||
|
||||
<!-- Page Heading -->
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 text-gray-800"><i class="bi bi-book me-2"></i>Manual de Uso do Sistema</h1>
|
||||
</div>
|
||||
|
||||
<!-- Table of Contents -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-list-ol me-2"></i>Sumário</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<ul class="list-unstyled">
|
||||
<li class="mb-2"><a href="#acesso" class="text-primary">1. Acesso ao Painel</a></li>
|
||||
<li class="mb-2"><a href="#dashboard" class="text-primary">2. Dashboard</a></li>
|
||||
<li class="mb-2"><a href="#usuarios" class="text-primary">3. Gerenciamento de Usuários</a></li>
|
||||
<li class="mb-2"><a href="#permissoes" class="text-primary">4. Permissões de Acesso</a></li>
|
||||
<li class="mb-2"><a href="#contatos" class="text-primary">5. Mensagens de Contato</a></li>
|
||||
<li class="mb-2"><a href="#assuntos" class="text-primary">6. Assuntos de Contato</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<ul class="list-unstyled">
|
||||
<li class="mb-2"><a href="#servicos" class="text-primary">7. Serviços</a></li>
|
||||
<li class="mb-2"><a href="#faq" class="text-primary">8. Perguntas Frequentes (FAQ)</a></li>
|
||||
<li class="mb-2"><a href="#noticias" class="text-primary">9. Notícias</a></li>
|
||||
<li class="mb-2"><a href="#downloads" class="text-primary">10. Central de Downloads</a></li>
|
||||
<li class="mb-2"><a href="#produtos" class="text-primary">11. Produtos</a></li>
|
||||
<li class="mb-2"><a href="#galerias" class="text-primary">12. Galerias de Imagens</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<ul class="list-unstyled">
|
||||
<li class="mb-2"><a href="#paginas" class="text-primary">13. Páginas Institucionais</a></li>
|
||||
<li class="mb-2"><a href="#marketing" class="text-primary">14. Marketing</a></li>
|
||||
<li class="mb-2"><a href="#configuracoes" class="text-primary">15. Configurações do Sistema</a></li>
|
||||
<li class="mb-2"><a href="#perfil" class="text-primary">16. Perfil e Preferências</a></li>
|
||||
<li class="mb-2"><a href="#notificacoes" class="text-primary">17. Notificações</a></li>
|
||||
<li class="mb-2"><a href="#dicas" class="text-primary">18. Dicas e Boas Práticas</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 1: Acesso ao Painel -->
|
||||
<div class="card shadow mb-4" id="acesso">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-lock me-2"></i>1. Acesso ao Painel Administrativo</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>Para acessar o painel administrativo do seu site:</p>
|
||||
<ol>
|
||||
<li>Acesse o endereço <code>http://seusite.com.br/login</code></li>
|
||||
<li>Insira seu <strong>e-mail</strong> e <strong>senha</strong> cadastrados</li>
|
||||
<li>Clique em <strong>"Entrar"</strong></li>
|
||||
<li>Após o login, você será redirecionado para o Dashboard</li>
|
||||
</ol>
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-info-circle me-1"></i>
|
||||
<strong>Primeiro acesso?</strong> Altere sua senha imediatamente em <strong>Configurações > Perfil</strong>.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 2: Dashboard -->
|
||||
<div class="card shadow mb-4" id="dashboard">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-speedometer2 me-2"></i>2. Dashboard</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>O Dashboard é a página inicial do painel administrativo. Ele apresenta:</p>
|
||||
<ul>
|
||||
<li><strong>Métricas rápidas</strong>: Total de usuários, produtos, serviços, galerias, páginas e notícias</li>
|
||||
<li><strong>Atalhos rápidos</strong>: Links para as funcionalidades mais utilizadas</li>
|
||||
<li><strong>Sugestão de funcionalidades</strong>: Use o formulário "Sugerir Funcionalidade" para enviar solicitações ao suporte</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 3: Usuários -->
|
||||
<div class="card shadow mb-4" id="usuarios">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-people me-2"></i>3. Gerenciamento de Usuários</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p><em>Disponível apenas para administradores.</em></p>
|
||||
<p>No menu <strong>Usuários</strong>, você pode:</p>
|
||||
<ul>
|
||||
<li><strong>Listar</strong> todos os usuários cadastrados no sistema</li>
|
||||
<li><strong>Criar</strong> novos usuários com tipo Admin ou Usuário comum</li>
|
||||
<li><strong>Editar</strong> dados de usuários existentes (nome, e-mail, tipo, avatar)</li>
|
||||
<li><strong>Excluir</strong> usuários (exceto o administrador principal)</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3"><i class="bi bi-tag me-1"></i>Tipos de Usuário</h6>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-sm">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th>Tipo</th>
|
||||
<th>Descrição</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><span class="badge badge-primary">Admin</span></td>
|
||||
<td>Acesso total ao painel, incluindo gerenciamento de usuários, tipos de usuário e todas as permissões</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><span class="badge badge-secondary">User</span></td>
|
||||
<td>Acesso limitado baseado em permissões específicas atribuídas pelo administrador</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h6 class="mt-3">Tipos de Usuário Personalizados</h6>
|
||||
<p>No menu <strong>Tipos de Usuário</strong>, você pode criar tipos personalizados com combinações específicas de permissões para diferentes perfis de acesso.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 4: Permissões -->
|
||||
<div class="card shadow mb-4" id="permissoes">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-shield-check me-2"></i>4. Permissões de Acesso</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>O sistema utiliza um modelo de permissões para controlar o acesso dos usuários. Ao editar um usuário, você pode atribuir permissões individuais:</p>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-sm">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th>Permissão</th>
|
||||
<th>Descrição</th>
|
||||
<th>Seção no Painel</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td><code>pages</code></td><td>Gerenciar páginas institucionais</td><td>Páginas</td></tr>
|
||||
<tr><td><code>news</code></td><td>Gerenciar notícias</td><td>Notícias</td></tr>
|
||||
<tr><td><code>galleries</code></td><td>Gerenciar galerias e categorias</td><td>Galerias</td></tr>
|
||||
<tr><td><code>products</code></td><td>Gerenciar produtos e categorias</td><td>Produtos</td></tr>
|
||||
<tr><td><code>services</code></td><td>Gerenciar serviços</td><td>Serviços</td></tr>
|
||||
<tr><td><code>contacts</code></td><td>Visualizar e responder mensagens de contato</td><td>Contatos</td></tr>
|
||||
<tr><td><code>subjects</code></td><td>Gerenciar assuntos do formulário de contato</td><td>Assuntos</td></tr>
|
||||
<tr><td><code>faqs</code></td><td>Gerenciar perguntas frequentes</td><td>FAQ</td></tr>
|
||||
<tr><td><code>downloads</code></td><td>Gerenciar arquivos para download</td><td>Downloads</td></tr>
|
||||
<tr><td><code>marketing</code></td><td>Acessar ferramentas de marketing, analytics e banners</td><td>Marketing</td></tr>
|
||||
<tr><td><code>settings</code></td><td>Alterar configurações globais do site</td><td>Dados da Empresa</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="alert alert-warning">
|
||||
<i class="bi bi-exclamation-triangle me-1"></i>
|
||||
<strong>Atenção:</strong> Administradores possuem acesso total automaticamente, sem necessidade de permissões individuais.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 5: Contatos -->
|
||||
<div class="card shadow mb-4" id="contatos">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-envelope me-2"></i>5. Mensagens de Contato</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>Todas as mensagens enviadas pelo formulário de contato do site são listadas no menu <strong>Contatos</strong>.</p>
|
||||
<h6 class="mt-2">Funcionalidades:</h6>
|
||||
<ul>
|
||||
<li><strong>Visualizar</strong>: Clique em uma mensagem para ver os detalhes completos (nome, e-mail, assunto, mensagem)</li>
|
||||
<li><strong>Responder</strong>: Digite sua resposta diretamente no painel. O cliente receberá um e-mail formatado com a resposta</li>
|
||||
<li><strong>Excluir</strong>: Remova mensagens antigas ou irrelevantes</li>
|
||||
</ul>
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-lightbulb me-1"></i>
|
||||
<strong>Dica:</strong> Configure os assuntos do formulário de contato no menu <strong>Assuntos</strong> para organizar melhor as mensagens recebidas (ex: Orçamento, Suporte, Comercial).
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 6: Assuntos -->
|
||||
<div class="card shadow mb-4" id="assuntos">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-tags me-2"></i>6. Assuntos de Contato</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>Assuntos</strong>, você gerencia as opções de assunto que aparecem no formulário de contato do site.</p>
|
||||
<ul>
|
||||
<li><strong>Criar</strong>: Adicione novos assuntos (ex: "Orçamento", "Suporte Técnico", "Parceria")</li>
|
||||
<li><strong>Editar</strong>: Altere o nome ou a descrição dos assuntos existentes</li>
|
||||
<li><strong>Ativar/Desativar</strong>: Assuntos desativados não aparecem no formulário, mas o histórico é mantido</li>
|
||||
<li><strong>Excluir</strong>: Remova assuntos não utilizados</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 7: Serviços -->
|
||||
<div class="card shadow mb-4" id="servicos">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-briefcase me-2"></i>7. Serviços</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>Serviços</strong>, você gerencia os serviços oferecidos pela empresa.</p>
|
||||
<h6 class="mt-2">Como cadastrar um serviço:</h6>
|
||||
<ol>
|
||||
<li>Clique em <strong>"Novo Serviço"</strong></li>
|
||||
<li>Preencha o <strong>nome</strong> do serviço</li>
|
||||
<li>Adicione uma <strong>descrição</strong> detalhada (suporta formatação HTML)</li>
|
||||
<li>Defina se o serviço está <strong>ativo</strong> ou <strong>inativo</strong></li>
|
||||
<li>Marque como <strong>destaque</strong> para que apareça em primeiro lugar</li>
|
||||
<li>Clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-lightbulb me-1"></i>
|
||||
Serviços inativos não aparecem no site público, mas permanecem salvos no sistema.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 8: FAQ -->
|
||||
<div class="card shadow mb-4" id="faq">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-question-circle me-2"></i>8. Perguntas Frequentes (FAQ)</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>FAQ</strong>, você gerencia as perguntas frequentes exibidas no site.</p>
|
||||
<h6 class="mt-2">Como cadastrar:</h6>
|
||||
<ol>
|
||||
<li>Clique em <strong>"Nova Pergunta"</strong></li>
|
||||
<li>Digite a <strong>pergunta</strong></li>
|
||||
<li>Digite a <strong>resposta</strong></li>
|
||||
<li>Defina a <strong>ordem</strong> de exibição (números menores aparecem primeiro)</li>
|
||||
<li>Marque como <strong>ativa</strong> para que apareça no site</li>
|
||||
<li>Clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-lightbulb me-1"></i>
|
||||
<strong>Dica:</strong> Coloque as perguntas mais comuns com ordem menor (1, 2, 3...) para que apareçam primeiro.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 9: Notícias -->
|
||||
<div class="card shadow mb-4" id="noticias">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-newspaper me-2"></i>9. Notícias</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>Notícias</strong>, você gerencia artigos de notícias publicados no site.</p>
|
||||
|
||||
<h6 class="mt-2">Como criar uma notícia:</h6>
|
||||
<ol>
|
||||
<li>Clique em <strong>"Nova Notícia"</strong></li>
|
||||
<li>Preencha o <strong>título</strong> da notícia</li>
|
||||
<li>O <strong>slug</strong> (endereço URL) é gerado automaticamente a partir do título, mas pode ser editado manualmente</li>
|
||||
<li>Escreva um <strong>resumo</strong> breve que aparecerá na listagem de notícias</li>
|
||||
<li>Escreva o <strong>conteúdo</strong> completo no editor</li>
|
||||
<li>Defina o <strong>autor</strong> da notícia</li>
|
||||
<li>Defina a <strong>data/hora de publicação</strong></li>
|
||||
<li>Faça upload da <strong>imagem principal</strong> (imagem de destaque)</li>
|
||||
<li>Configure os <strong>campos SEO</strong>:
|
||||
<ul>
|
||||
<li><strong>Título SEO</strong>: Título que aparece nos resultados do Google</li>
|
||||
<li><strong>Meta Description</strong>: Descrição que aparece nos resultados de busca</li>
|
||||
<li><strong>Palavras-chave</strong>: Termos relevantes para indexação</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Marque como <strong>ativa</strong> para publicar</li>
|
||||
<li>Clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
|
||||
<h6 class="mt-3">Galeria de Imagens Adicionais</h6>
|
||||
<p>Após criar a notícia, você pode adicionar imagens adicionais na tela de edição:</p>
|
||||
<ol>
|
||||
<li>Na edição da notícia, use a seção <strong>"Adicionar Imagens"</strong></li>
|
||||
<li>Selecione uma ou mais imagens</li>
|
||||
<li>Adicione uma <strong>descrição/legenda</strong> para cada imagem</li>
|
||||
<li>As imagens podem ser visualizadas em carrossel na página da notícia no site público</li>
|
||||
</ol>
|
||||
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-lightbulb me-1"></i>
|
||||
<strong>Dica:</strong> Notícias desativadas não aparecem no site, mas permanecem salvas. Use esse recurso para rascunhos.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 10: Downloads -->
|
||||
<div class="card shadow mb-4" id="downloads">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-download me-2"></i>10. Central de Downloads</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>Downloads</strong>, você gerencia arquivos disponibilizados para os visitantes do site.</p>
|
||||
<h6 class="mt-2">Como cadastrar:</h6>
|
||||
<ol>
|
||||
<li>Clique em <strong>"Novo Download"</strong></li>
|
||||
<li>Preencha o <strong>nome</strong> do arquivo</li>
|
||||
<li>Adicione uma <strong>descrição</strong></li>
|
||||
<li>Selecione o <strong>tipo</strong>: Driver, Manual, Software ou Outro</li>
|
||||
<li>Faça o <strong>upload do arquivo</strong> (até 20MB)</li>
|
||||
<li>Defina se requer <strong>login</strong> para download</li>
|
||||
<li>Marque como <strong>ativo</strong></li>
|
||||
<li>Clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 11: Produtos -->
|
||||
<div class="card shadow mb-4" id="produtos">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-box me-2"></i>11. Produtos</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>Produtos</strong>, você gerencia o catálogo de produtos.</p>
|
||||
|
||||
<h6 class="mt-2">Categorias de Produtos</h6>
|
||||
<p>Antes de cadastrar produtos, crie as categorias:</p>
|
||||
<ol>
|
||||
<li>Acesse <strong>Produtos > Categorias</strong></li>
|
||||
<li>Clique em <strong>"Nova Categoria"</strong></li>
|
||||
<li>Preencha nome e descrição</li>
|
||||
<li>Clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
|
||||
<h6 class="mt-3">Cadastrando um Produto</h6>
|
||||
<ol>
|
||||
<li>Acesse <strong>Produtos > Novo Produto</strong></li>
|
||||
<li>Preencha nome, descrição, preço e categoria</li>
|
||||
<li>Faça upload da imagem principal</li>
|
||||
<li>Adicione imagens adicionais à galeria do produto</li>
|
||||
<li>Marque como <strong>destaque</strong> se desejar</li>
|
||||
<li>Ative o produto e clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 12: Galerias -->
|
||||
<div class="card shadow mb-4" id="galerias">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-images me-2"></i>12. Galerias de Imagens</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>Galerias</strong>, você gerencia álbuns de fotos organizados por categorias.</p>
|
||||
|
||||
<h6 class="mt-2">Categorias de Galerias</h6>
|
||||
<p>As galerias são organizadas por categorias. No site público, o visitante navega pelas categorias no menu e visualiza as galerias de cada uma.</p>
|
||||
<ol>
|
||||
<li>Acesse <strong>Galerias > Categorias</strong></li>
|
||||
<li>Clique em <strong>"Nova Categoria"</strong></li>
|
||||
<li>Preencha nome e descrição</li>
|
||||
<li>Clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
|
||||
<h6 class="mt-3">Criando uma Galeria</h6>
|
||||
<ol>
|
||||
<li>Clique em <strong>"Nova Galeria"</strong></li>
|
||||
<li>Preencha o <strong>título</strong> da galeria</li>
|
||||
<li>Adicione uma <strong>descrição</strong></li>
|
||||
<li>Selecione a <strong>categoria</strong></li>
|
||||
<li>Clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
|
||||
<h6 class="mt-3">Adicionando Imagens</h6>
|
||||
<ol>
|
||||
<li>Abra a galeria para edição</li>
|
||||
<li>Na seção de upload, selecione uma ou mais imagens (até 5MB cada)</li>
|
||||
<li>Após o upload, você pode adicionar <strong>legendas/descrições</strong> para cada imagem</li>
|
||||
<li>Reordene as imagens conforme necessário</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 13: Páginas -->
|
||||
<div class="card shadow mb-4" id="paginas">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-file-earmark-text me-2"></i>13. Páginas Institucionais</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>Páginas</strong>, você gerencia as páginas institucionais do site (Sobre Nós, Missão, etc.).</p>
|
||||
<h6 class="mt-2">Como criar uma página:</h6>
|
||||
<ol>
|
||||
<li>Clique em <strong>"Nova Página"</strong></li>
|
||||
<li>Preencha o <strong>título</strong> da página</li>
|
||||
<li>O <strong>slug</strong> é gerado automaticamente (ex: <code>/sobre-nos</code>)</li>
|
||||
<li>Escreva o <strong>conteúdo</strong> no editor visual</li>
|
||||
<li>Configure os <strong>campos SEO</strong>:
|
||||
<ul>
|
||||
<li><strong>Título SEO</strong>: Aparece na aba do navegador e nos resultados do Google</li>
|
||||
<li><strong>Meta Description</strong>: Descrição exibida nos resultados de busca</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Marque como <strong>ativa</strong> para publicar</li>
|
||||
<li>Clique em <strong>"Salvar"</strong></li>
|
||||
</ol>
|
||||
<div class="alert alert-info">
|
||||
<i class="bi bi-lightbulb me-1"></i>
|
||||
<strong>Dica:</strong> Páginas ativas aparecem automaticamente no menu de navegação do site público.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 14: Marketing -->
|
||||
<div class="card shadow mb-4" id="marketing">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-megaphone me-2"></i>14. Marketing</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>A seção de <strong>Marketing</strong> oferece ferramentas para divulgar seu negócio e analisar visitantes.</p>
|
||||
|
||||
<h6 class="mt-2"><i class="bi bi-graph-up me-1"></i>Análise de Visitantes</h6>
|
||||
<ul>
|
||||
<li><strong>Gráfico de acessos</strong>: Visualize o tráfego dos últimos 7 dias</li>
|
||||
<li><strong>Geolocalização</strong>: Veja de quais países e cidades os visitantes acessam seu site</li>
|
||||
<li><strong>Páginas mais visitadas</strong>: Descubra quais conteúdos atraem mais visitantes</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3"><i class="bi bi-image me-1"></i>Banners da Home</h6>
|
||||
<ul>
|
||||
<li>Gerencie os banners que aparecem na página inicial do site</li>
|
||||
<li>Faça upload de imagens de alta qualidade (recomendado: 1920x600px)</li>
|
||||
<li>Defina título, subtítulo e link de redirecionamento para cada banner</li>
|
||||
<li>Controle a ordem e o status (ativo/inativo) de cada banner</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3"><i class="bi bi-share me-1"></i>Promover Produtos e Serviços</h6>
|
||||
<ul>
|
||||
<li>Selecione um produto ou serviço específico</li>
|
||||
<li>Obtenha links diretos para compartilhamento</li>
|
||||
<li>Use os botões de WhatsApp, Facebook e LinkedIn para divulgar rapidamente</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3"><i class="bi bi-envelope-heart me-1"></i>Email Marketing</h6>
|
||||
<ul>
|
||||
<li>Redija um comunicado com assunto e corpo do e-mail</li>
|
||||
<li>Vincule um produto ou serviço para inclusão automática de imagem e link</li>
|
||||
<li>Ao enviar, todos os usuários cadastrados receberão a mensagem formatada</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 15: Configurações -->
|
||||
<div class="card shadow mb-4" id="configuracoes">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-gear me-2"></i>15. Configurações do Sistema</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>No menu <strong>Dados da Empresa</strong>, você gerencia as configurações globais do site:</p>
|
||||
|
||||
<h6 class="mt-2">Dados da Empresa</h6>
|
||||
<ul>
|
||||
<li><strong>Nome da empresa</strong>: Exibido no cabeçalho e rodapé do site</li>
|
||||
<li><strong>CNPJ</strong>: Informação legal da empresa</li>
|
||||
<li><strong>Endereço</strong>: Exibido no rodapé e na página de contato</li>
|
||||
<li><strong>Telefone</strong>: Utilizado também para o botão flutuante do WhatsApp</li>
|
||||
<li><strong>E-mail</strong>: E-mail principal de contato</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3">Redes Sociais</h6>
|
||||
<ul>
|
||||
<li>Configure os links do <strong>Facebook</strong>, <strong>Instagram</strong>, <strong>LinkedIn</strong> e <strong>YouTube</strong></li>
|
||||
<li>Os ícones das redes sociais aparecem automaticamente no rodapé do site</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3">WhatsApp</h6>
|
||||
<ul>
|
||||
<li><strong>Ativar/Desativar</strong>: Controle a exibição do botão flutuante</li>
|
||||
<li><strong>Horário de funcionamento</strong>: Defina horário de início, término e pausa para almoço</li>
|
||||
<li><strong>Mensagem padrão</strong>: Texto pré-preenchido quando o visitante clica no botão</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3">SEO Global</h6>
|
||||
<ul>
|
||||
<li><strong>Título padrão</strong>: Título exibido nas abas do navegador</li>
|
||||
<li><strong>Palavras-chave</strong>: Termos para indexação global do site</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3">Scripts de Rastreamento</h6>
|
||||
<ul>
|
||||
<li>Insira códigos como <strong>Google Analytics</strong> ou <strong>Facebook Pixel</strong></li>
|
||||
<li>Os scripts são injetados automaticamente em todas as páginas</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3">Modo Manutenção</h6>
|
||||
<ul>
|
||||
<li>Ative para exibir uma página de "Em Manutenção" para visitantes</li>
|
||||
<li>Enquanto ativo, administradores continuam tendo acesso ao painel</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 16: Perfil -->
|
||||
<div class="card shadow mb-4" id="perfil">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-person-circle me-2"></i>16. Perfil e Preferências</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h6 class="mt-2"><i class="bi bi-pencil me-1"></i>Editar Perfil</h6>
|
||||
<p>Em <strong>Configurações > Perfil</strong>, você pode alterar:</p>
|
||||
<ul>
|
||||
<li><strong>Nome</strong> completo</li>
|
||||
<li><strong>E-mail</strong></li>
|
||||
<li><strong>Avatar</strong> (foto de perfil)</li>
|
||||
<li><strong>Senha</strong> de acesso</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3"><i class="bi bi-sliders me-1"></i>Preferências</h6>
|
||||
<p>Em <strong>Configurações > Preferências</strong>, você pode personalizar:</p>
|
||||
<ul>
|
||||
<li><strong>Modo escuro</strong>: Ative/desative o tema escuro no painel administrativo</li>
|
||||
<li><strong>Notificações por e-mail</strong>: Controle o recebimento de notificações</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 17: Notificações -->
|
||||
<div class="card shadow mb-4" id="notificacoes">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-bell me-2"></i>17. Notificações</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>O sistema envia notificações automáticas para os administradores. Elas aparecem no ícone de sino na barra superior.</p>
|
||||
|
||||
<h6 class="mt-2">Eventos que geram notificações:</h6>
|
||||
<ul>
|
||||
<li><strong>Novo usuário cadastrado</strong>: Quando alguém se registra no site</li>
|
||||
<li><strong>Nova mensagem de contato</strong>: Quando um visitante envia uma mensagem</li>
|
||||
<li><strong>Conteúdo criado/alterado</strong>: Quando páginas, galerias, notícias, produtos ou serviços são criados ou modificados</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3">Gerenciando notificações:</h6>
|
||||
<ul>
|
||||
<li>Clique no <strong>ícone de sino</strong> na barra superior para ver as notificações não lidas</li>
|
||||
<li>Clique em uma notificação para ser redirecionado ao conteúdo relacionado</li>
|
||||
<li>Clique em <strong>"Marcar todas como lidas"</strong> para limpar a lista</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 18: Dicas -->
|
||||
<div class="card shadow mb-4" id="dicas">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary"><i class="bi bi-stars me-2"></i>18. Dicas e Boas Práticas</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h6 class="mt-2"><i class="bi bi-search me-1"></i>SEO</h6>
|
||||
<ul>
|
||||
<li>Sempre preencha os campos de <strong>Título SEO</strong> e <strong>Meta Description</strong> em páginas e notícias</li>
|
||||
<li>Use palavras-chave relevantes no conteúdo</li>
|
||||
<li>Mantenha os slugs curtos e descritivos</li>
|
||||
<li>Utilize imagens com textos alternativos</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3"><i class="bi bi-image me-1"></i>Imagens</h6>
|
||||
<ul>
|
||||
<li>Use imagens otimizadas para web (formato WebP ou JPEG comprimido)</li>
|
||||
<li>Banners: resolução recomendada de <strong>1920x600px</strong></li>
|
||||
<li>Imagens de galeria: limite de <strong>5MB</strong> por arquivo</li>
|
||||
<li>Downloads: limite de <strong>20MB</strong> por arquivo</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h6 class="mt-2"><i class="bi bi-shield-check me-1"></i>Segurança</h6>
|
||||
<ul>
|
||||
<li>Altere a senha padrão após o primeiro acesso</li>
|
||||
<li>Use senhas fortes com letras, números e caracteres especiais</li>
|
||||
<li>Revise periodicamente as permissões dos usuários</li>
|
||||
<li>Desative usuários que não precisam mais de acesso</li>
|
||||
</ul>
|
||||
|
||||
<h6 class="mt-3"><i class="bi bi-clock-history me-1"></i>Manutenção</h6>
|
||||
<ul>
|
||||
<li>Ative o <strong>Modo Manutenção</strong> antes de fazer grandes alterações</li>
|
||||
<li>Revise periodicamente as mensagens de contato</li>
|
||||
<li>Mantenha o FAQ atualizado para reduzir chamados de suporte</li>
|
||||
<li>Verifique os dados da empresa periodicamente</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Back to top -->
|
||||
<div class="text-center mb-4">
|
||||
<a href="#" class="btn btn-primary btn-sm">
|
||||
<i class="bi bi-arrow-up me-1"></i>Voltar ao topo
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@endsection
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Análise de Visitantes')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Análise de Visitantes</h1>
|
||||
<a href="{{ route('admin.marketing.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- Gráfico de Acessos (Últimos 7 dias) -->
|
||||
<div class="col-xl-12 col-lg-12">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Acessos nos Últimos 7 Dias</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="chart-area">
|
||||
<canvas id="accessChart" style="height: 300px;"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- Ranking por País -->
|
||||
<div class="col-lg-6">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Top 10 Países</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>País</th>
|
||||
<th class="text-center">Acessos</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($countries as $country)
|
||||
<tr>
|
||||
<td><i class="bi bi-globe-americas text-muted me-2"></i> {{ $country->country }}</td>
|
||||
<td class="text-center"><span class="badge badge-primary">{{ $country->total }}</span></td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr><td colspan="2" class="text-center">Nenhum dado capturado ainda.</td></tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Ranking por Cidade -->
|
||||
<div class="col-lg-6">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Top 10 Cidades</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Cidade / Região</th>
|
||||
<th class="text-center">Acessos</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($cities as $city)
|
||||
<tr>
|
||||
<td><i class="bi bi-geo-alt text-danger me-2"></i> {{ $city->city }} ({{ $city->region }})</td>
|
||||
<td class="text-center"><span class="badge badge-success">{{ $city->total }}</span></td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr><td colspan="2" class="text-center">Nenhum dado capturado ainda.</td></tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info border-0 shadow-sm small">
|
||||
<i class="bi bi-info-circle me-2"></i> <strong>Nota:</strong> A localização é estimada com base no endereço IP do visitante. A precisão pode variar dependendo do provedor de internet. Os dados são capturados apenas em páginas públicas (não administrativas).
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('js')
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<script>
|
||||
const ctx = document.getElementById('accessChart').getContext('2d');
|
||||
const accessChart = new Chart(ctx, {
|
||||
type: 'line',
|
||||
data: {
|
||||
labels: JSON.parse('<?php echo json_encode($last7Days->pluck("date")); ?>'),
|
||||
datasets: [{
|
||||
label: 'Visitas',
|
||||
data: JSON.parse('<?php echo json_encode($last7Days->pluck("total")); ?>'),
|
||||
backgroundColor: 'rgba(78, 115, 223, 0.05)',
|
||||
borderColor: 'rgba(78, 115, 223, 1)',
|
||||
pointRadius: 3,
|
||||
pointBackgroundColor: 'rgba(78, 115, 223, 1)',
|
||||
pointBorderColor: 'rgba(78, 115, 223, 1)',
|
||||
pointHoverRadius: 3,
|
||||
pointHoverBackgroundColor: 'rgba(78, 115, 223, 1)',
|
||||
pointHoverBorderColor: 'rgba(78, 115, 223, 1)',
|
||||
pointHitRadius: 10,
|
||||
pointBorderWidth: 2,
|
||||
fill: true,
|
||||
tension: 0.3
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
maintainAspectRatio: false,
|
||||
scales: {
|
||||
y: {
|
||||
beginAtZero: true,
|
||||
ticks: {
|
||||
stepSize: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'E-mail Marketing')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Disparo de E-mail Marketing</h1>
|
||||
<a href="{{ route('admin.marketing.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Compor E-mail Promocional</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.marketing.email.send') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Assunto do E-mail</label>
|
||||
<input type="text" name="subject" class="form-control @error('subject') is-invalid @enderror" value="{{ old('subject') }}" placeholder="Ex: Oferta Especial: 20% de desconto em Notebooks!" required>
|
||||
@error('subject') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Mensagem</label>
|
||||
<textarea name="message" id="editor" class="form-control @error('message') is-invalid @enderror" rows="10">{{ old('message') }}</textarea>
|
||||
@error('message') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Texto do Botão (Opcional)</label>
|
||||
<input type="text" name="button_text" class="form-control" value="{{ old('button_text') }}" placeholder="Ex: Ver Oferta">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">URL do Botão (Opcional)</label>
|
||||
<input type="url" name="button_url" class="form-control" value="{{ old('button_url') }}" placeholder="Ex: https://seusite.com/promo">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<label class="font-weight-bold text-primary"><i class="bi bi-image me-1"></i> Incluir Imagem de Destaque (Opcional)</label>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<label class="small text-muted">Escolher um Produto:</label>
|
||||
<select name="product_id" class="form-control form-control-sm mb-2">
|
||||
<option value="">Nenhum produto</option>
|
||||
@foreach($products as $product)
|
||||
<option value="{{ $product->id }}">{{ $product->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="small text-muted">Ou escolher um Serviço:</label>
|
||||
<select name="service_id" class="form-control form-control-sm mb-2">
|
||||
<option value="">Nenhum serviço</option>
|
||||
@foreach($services as $service)
|
||||
<option value="{{ $service->id }}">{{ $service->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<small class="text-muted">A imagem principal do item selecionado será enviada no topo do e-mail.</small>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm" onclick="return confirm('Deseja enviar este e-mail para todos os {{ $userCount }} clientes cadastrados?')">
|
||||
<i class="bi bi-send me-1"></i> Disparar E-mail para {{ $userCount }} Clientes
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3 bg-light">
|
||||
<h6 class="m-0 font-weight-bold text-dark">Informações Importantes</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="alert alert-info small border-0">
|
||||
<i class="bi bi-info-circle me-1"></i> Os e-mails serão enviados para todos os usuários com o tipo "User" que possuem a preferência de e-mail ativada.
|
||||
</div>
|
||||
<h6 class="font-weight-bold small">Dicas para um bom e-mail:</h6>
|
||||
<ul class="small text-muted pl-3">
|
||||
<li>Use um assunto curto e chamativo.</li>
|
||||
<li>Vá direto ao ponto na mensagem.</li>
|
||||
<li>Sempre inclua um botão de ação (CTA).</li>
|
||||
<li>Evite e-mails muito longos com muitas imagens.</li>
|
||||
</ul>
|
||||
<hr>
|
||||
<p class="small text-center text-muted mb-0">Total de destinatários aptos: <br><strong>{{ $userCount }} clientes</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('css')
|
||||
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.css" rel="stylesheet">
|
||||
@endpush
|
||||
|
||||
@push('js')
|
||||
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#editor').summernote({
|
||||
height: 300,
|
||||
tabsize: 2,
|
||||
toolbar: [
|
||||
['style', ['style']],
|
||||
['font', ['bold', 'underline', 'clear']],
|
||||
['color', ['color']],
|
||||
['para', ['ul', 'ol', 'paragraph']],
|
||||
['view', ['fullscreen', 'codeview']]
|
||||
]
|
||||
});
|
||||
|
||||
// Garantir que apenas um select de imagem seja usado
|
||||
$('select[name="product_id"]').change(function() {
|
||||
if($(this).val() != "") $('select[name="service_id"]').val("");
|
||||
});
|
||||
$('select[name="service_id"]').change(function() {
|
||||
if($(this).val() != "") $('select[name="product_id"]').val("");
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
+182
@@ -0,0 +1,182 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Marketing & Promoção')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Marketing & Promoção</h1>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- Card Banners -->
|
||||
<div class="col-xl-4 col-md-6 mb-4">
|
||||
<div class="card border-left-primary shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
|
||||
Destaques do Site</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Gerenciar Banners</div>
|
||||
<p class="small text-muted mt-2">Crie banners rotativos para a página inicial para promover novidades e ofertas.</p>
|
||||
<a href="{{ route('admin.marketing.banners.index') }}" class="btn btn-sm btn-primary">Acessar</a>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-images text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card Promoção de Produtos -->
|
||||
<div class="col-xl-4 col-md-6 mb-4">
|
||||
<div class="card border-left-success shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-success text-uppercase mb-1">
|
||||
Vendas Rápidas</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Promover Produtos</div>
|
||||
<p class="small text-muted mt-2">Gere links de compartilhamento para WhatsApp e Redes Sociais com mensagens prontas.</p>
|
||||
<a href="{{ route('admin.marketing.promote.products') }}" class="btn btn-sm btn-success">Acessar</a>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-share text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card Promoção de Serviços -->
|
||||
<div class="col-xl-4 col-md-6 mb-4">
|
||||
<div class="card border-left-warning shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-warning text-uppercase mb-1">
|
||||
Atrair Clientes</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Promover Serviços</div>
|
||||
<p class="small text-muted mt-2">Promova seus serviços especializados e atraia novas solicitações de orçamento.</p>
|
||||
<a href="{{ route('admin.marketing.promote.services') }}" class="btn btn-sm btn-warning text-white">Acessar</a>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-bell text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card E-mail Marketing -->
|
||||
<div class="col-xl-4 col-md-6 mb-4">
|
||||
<div class="card border-left-danger shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-danger text-uppercase mb-1">
|
||||
Fidelização</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">E-mail Marketing</div>
|
||||
<p class="small text-muted mt-2">Envie promoções, novidades e ofertas personalizadas para todos os seus clientes por e-mail.</p>
|
||||
<a href="{{ route('admin.marketing.email') }}" class="btn btn-sm btn-danger shadow-sm">Configurar Disparo</a>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-envelope-open text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card Visitantes -->
|
||||
<div class="col-xl-4 col-md-6 mb-4">
|
||||
<div class="card border-left-dark shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-dark text-uppercase mb-1">
|
||||
Geolocalização</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Análise de Visitantes</div>
|
||||
<p class="small text-muted mt-2">Visualize de quais cidades e países as pessoas estão acessando o seu site em tempo real.</p>
|
||||
<a href="{{ route('admin.marketing.analytics') }}" class="btn btn-sm btn-dark shadow-sm">Ver Relatórios</a>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-geo-alt text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card SEO -->
|
||||
<div class="col-xl-4 col-md-6 mb-4">
|
||||
<div class="card border-left-info shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">
|
||||
Visibilidade</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">Configurações de SEO</div>
|
||||
<p class="small text-muted mt-2">Ajuste as meta-tags globais do site para melhorar o ranqueamento no Google.</p>
|
||||
<a href="{{ route('admin.settings.index') }}#seo" class="btn btn-sm btn-info">Configurar</a>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-search text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Promoção SysCRM -->
|
||||
<div class="card shadow mb-4 border-bottom-primary overflow-hidden">
|
||||
<div class="row no-gutters">
|
||||
<div class="col-md-4 bg-primary d-flex align-items-center justify-content-center p-5">
|
||||
<div class="text-center text-white">
|
||||
<i class="bi bi-people mb-3"></i>
|
||||
<h2 class="font-weight-bold">SysCRM</h2>
|
||||
<p class="lead">Gestão de Relacionamento</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<div class="card-body p-5">
|
||||
<h3 class="font-weight-bold text-primary mb-3">Potencialize suas vendas com o SysCRM</h3>
|
||||
<p class="text-muted lead">Integre sua estratégia de marketing com a melhor ferramenta de gestão de clientes. O SysCRM permite que você acompanhe cada lead gerado pelo seu site, organize seu funil de vendas e nunca perca um negócio.</p>
|
||||
<ul class="list-unstyled mb-4">
|
||||
<li class="mb-2"><i class="bi bi-check-circle text-success me-2"></i> Funil de Vendas Visual e Intuitivo</li>
|
||||
<li class="mb-2"><i class="bi bi-check-circle text-success me-2"></i> Gestão de Contatos e Histórico Completo</li>
|
||||
<li class="mb-2"><i class="bi bi-check-circle text-success me-2"></i> Automação de Tarefas e Lembretes</li>
|
||||
<li><i class="bi bi-check-circle text-success me-2"></i> Integração Direta com seu Site</li>
|
||||
</ul>
|
||||
<div class="d-flex gap-3">
|
||||
<a href="https://syscrm.syspanel.com.br" target="_blank" class="btn btn-primary btn-lg px-5 shadow-sm">
|
||||
<i class="bi bi-box-arrow-up-right me-2"></i> Conhecer o SysCRM
|
||||
</a>
|
||||
<a href="https://wa.me/5535992261684?text=Olá! Tenho interesse no SysCRM." target="_blank" class="btn btn-success btn-lg px-5 shadow-sm">
|
||||
<i class="bi bi-whatsapp me-2"></i> Tenho Interesse
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Dicas de Marketing</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h5 class="font-weight-bold"><i class="bi bi-whatsapp text-success me-2"></i> WhatsApp Marketing</h5>
|
||||
<p>Use a ferramenta de <strong>Promover Produtos</strong> para enviar ofertas personalizadas aos seus clientes. Uma mensagem com foto e link direto aumenta em 40% a chance de conversão.</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h5 class="font-weight-bold"><i class="bi bi-megaphone text-primary me-2"></i> Banners Estratégicos</h5>
|
||||
<p>Mantenha sempre pelo menos 2 banners ativos: um com um produto em destaque e outro com um serviço ou diferencial da sua empresa (ex: "Orçamento Grátis").</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Promover Produtos')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Promover Produtos</h1>
|
||||
<a href="{{ route('admin.marketing.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Ferramentas de Compartilhamento</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="text-muted mb-4">Escolha um produto abaixo para gerar links de compartilhamento rápido em suas redes sociais e WhatsApp.</p>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover border" width="100%" cellspacing="0">
|
||||
<thead class="bg-light">
|
||||
<tr>
|
||||
<th width="80">Foto</th>
|
||||
<th>Produto</th>
|
||||
<th>Categoria</th>
|
||||
<th>Preço</th>
|
||||
<th width="350">Links de Promoção</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($products as $product)
|
||||
<tr>
|
||||
<td>
|
||||
@if($product->image)
|
||||
<img src="{{ asset('storage/' . $product->image) }}" class="img-thumbnail" style="height: 40px; width: 40px; object-fit: cover;">
|
||||
@else
|
||||
<div class="bg-light d-flex align-items-center justify-content-center" style="height: 40px; width: 40px;">
|
||||
<i class="bi bi-box text-muted"></i>
|
||||
</div>
|
||||
@endif
|
||||
</td>
|
||||
<td class="font-weight-bold text-dark">{{ $product->name }}</td>
|
||||
<td>
|
||||
<span class="badge badge-info">{{ $product->category->name ?? 'Sem Categoria' }}</span>
|
||||
</td>
|
||||
<td>R$ {{ number_format($product->price, 2, ',', '.') }}</td>
|
||||
<td>
|
||||
@php
|
||||
$productLink = route('produtos', ['categoria' => $product->category->slug ?? '']);
|
||||
$productPrice = number_format($product->price, 2, ',', '.');
|
||||
|
||||
$rawMessage = \App\Models\Setting::get('marketing_product_text', 'Confira este produto incrível: {name} por apenas R$ {price}. Veja mais detalhes aqui: {link}');
|
||||
$shareMessage = str_replace(
|
||||
['{name}', '{price}', '{link}'],
|
||||
[$product->name, $productPrice, $productLink],
|
||||
$rawMessage
|
||||
);
|
||||
@endphp
|
||||
<div class="btn-group">
|
||||
<!-- WhatsApp Share -->
|
||||
<a href="https://wa.me/?text={{ urlencode($shareMessage) }}"
|
||||
target="_blank" class="btn btn-sm btn-success" title="Enviar para WhatsApp">
|
||||
<i class="bi bi-whatsapp me-1"></i> WhatsApp
|
||||
</a>
|
||||
|
||||
<!-- Facebook Share -->
|
||||
<a href="https://www.facebook.com/sharer/sharer.php?u={{ urlencode($productLink) }}"
|
||||
target="_blank" class="btn btn-sm btn-primary" title="Compartilhar no Facebook">
|
||||
<i class="bi bi-facebook me-1"></i> Facebook
|
||||
</a>
|
||||
|
||||
<!-- LinkedIn Share -->
|
||||
<a href="https://www.linkedin.com/sharing/share-offsite/?url={{ urlencode($productLink) }}"
|
||||
target="_blank" class="btn btn-sm btn-info" title="Compartilhar no LinkedIn">
|
||||
<i class="bi bi-linkedin me-1"></i> LinkedIn
|
||||
</a>
|
||||
|
||||
<!-- Copy Link -->
|
||||
<button type="button" class="btn btn-sm btn-light border copy-link"
|
||||
data-url="{{ $productLink }}" title="Copiar Link">
|
||||
<i class="bi bi-link-45deg"></i>
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('.copy-link').click(function() {
|
||||
var url = $(this).data('url');
|
||||
var tempInput = $("<input>");
|
||||
$("body").append(tempInput);
|
||||
tempInput.val(url).select();
|
||||
document.execCommand("copy");
|
||||
tempInput.remove();
|
||||
|
||||
$(this).removeClass('btn-light').addClass('btn-dark text-white');
|
||||
var btn = $(this);
|
||||
setTimeout(function() {
|
||||
btn.removeClass('btn-dark text-white').addClass('btn-light');
|
||||
}, 1000);
|
||||
|
||||
alert('Link copiado para a área de transferência!');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Promover Serviços')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Promover Serviços</h1>
|
||||
<a href="{{ route('admin.marketing.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Ferramentas de Compartilhamento de Serviços</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="text-muted mb-4">Escolha um serviço abaixo para gerar links de compartilhamento rápido e atrair novos orçamentos.</p>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover border" width="100%" cellspacing="0">
|
||||
<thead class="bg-light">
|
||||
<tr>
|
||||
<th width="80">Ícone</th>
|
||||
<th>Serviço</th>
|
||||
<th width="350">Links de Promoção</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($services as $service)
|
||||
<tr>
|
||||
<td class="text-center">
|
||||
@if($service->icon)
|
||||
<i class="{{ $service->icon }} text-primary"></i>
|
||||
@else
|
||||
<i class="bi bi-bell text-muted"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td class="font-weight-bold text-dark">{{ $service->name }}</td>
|
||||
<td>
|
||||
@php
|
||||
$serviceLink = route('servicos');
|
||||
|
||||
$rawMessage = \App\Models\Setting::get('marketing_service_text', 'Precisa de {name}? Nós podemos te ajudar! Confira nossos serviços aqui: {link}');
|
||||
$shareMessage = str_replace(
|
||||
['{name}', '{link}'],
|
||||
[$service->name, $serviceLink],
|
||||
$rawMessage
|
||||
);
|
||||
@endphp
|
||||
<div class="btn-group">
|
||||
<!-- WhatsApp Share -->
|
||||
<a href="https://wa.me/?text={{ urlencode($shareMessage) }}"
|
||||
target="_blank" class="btn btn-sm btn-success" title="Enviar para WhatsApp">
|
||||
<i class="bi bi-whatsapp me-1"></i> WhatsApp
|
||||
</a>
|
||||
|
||||
<!-- Facebook Share -->
|
||||
<a href="https://www.facebook.com/sharer/sharer.php?u={{ urlencode($serviceLink) }}"
|
||||
target="_blank" class="btn btn-sm btn-primary" title="Compartilhar no Facebook">
|
||||
<i class="bi bi-facebook me-1"></i> Facebook
|
||||
</a>
|
||||
|
||||
<!-- LinkedIn Share -->
|
||||
<a href="https://www.linkedin.com/sharing/share-offsite/?url={{ urlencode($serviceLink) }}"
|
||||
target="_blank" class="btn btn-sm btn-info" title="Compartilhar no LinkedIn">
|
||||
<i class="bi bi-linkedin me-1"></i> LinkedIn
|
||||
</a>
|
||||
|
||||
<!-- Copy Link -->
|
||||
<button type="button" class="btn btn-sm btn-light border copy-link"
|
||||
data-url="{{ $serviceLink }}" title="Copiar Link">
|
||||
<i class="bi bi-link-45deg"></i>
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('.copy-link').click(function() {
|
||||
var url = $(this).data('url');
|
||||
var tempInput = $("<input>");
|
||||
$("body").append(tempInput);
|
||||
tempInput.val(url).select();
|
||||
document.execCommand("copy");
|
||||
tempInput.remove();
|
||||
|
||||
$(this).removeClass('btn-light').addClass('btn-dark text-white');
|
||||
var btn = $(this);
|
||||
setTimeout(function() {
|
||||
btn.removeClass('btn-dark text-white').addClass('btn-light');
|
||||
}, 1000);
|
||||
|
||||
alert('Link copiado para a área de transferência!');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
Executable
+111
@@ -0,0 +1,111 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Nova Notícia')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Criar Notícia</h1>
|
||||
<a href="{{ route('admin.news.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações da Notícia</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.news.store') }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título</label>
|
||||
<input type="text" name="title" id="title" class="form-control @error('title') is-invalid @enderror" value="{{ old('title') }}" required placeholder="Ex: Lançamento de novo produto">
|
||||
@error('title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Slug (URL)</label>
|
||||
<input type="text" name="slug" id="slug" class="form-control @error('slug') is-invalid @enderror" value="{{ old('slug') }}" required>
|
||||
@error('slug') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Autor</label>
|
||||
<input type="text" name="author" class="form-control @error('author') is-invalid @enderror" value="{{ old('author') }}" placeholder="Nome do autor">
|
||||
@error('author') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Data/Hora de Publicação</label>
|
||||
<input type="datetime-local" name="published_at" class="form-control @error('published_at') is-invalid @enderror" value="{{ old('published_at') }}">
|
||||
@error('published_at') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<small class="text-muted">Deixe vazio para publicar imediatamente.</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Imagem Principal</label>
|
||||
<input type="file" name="featured_image" class="form-control-file @error('featured_image') is-invalid @enderror" accept="image/*">
|
||||
@error('featured_image') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<small class="text-muted">Imagem de destaque da notícia (máx. 5MB).</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Resumo</label>
|
||||
<textarea name="summary" class="form-control @error('summary') is-invalid @enderror" rows="2" maxlength="500">{{ old('summary') }}</textarea>
|
||||
@error('summary') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<small class="text-muted">Breve descrição exibida na listagem (máx. 500 caracteres).</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Conteúdo</label>
|
||||
<textarea name="content" class="form-control @error('content') is-invalid @enderror" rows="10">{{ old('content') }}</textarea>
|
||||
@error('content') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<h6 class="font-weight-bold text-muted mb-3">SEO (Opcional)</h6>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título SEO</label>
|
||||
<input type="text" name="seo_title" class="form-control @error('seo_title') is-invalid @enderror" value="{{ old('seo_title') }}" placeholder="Título para mecanismos de busca">
|
||||
@error('seo_title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição SEO</label>
|
||||
<textarea name="seo_description" class="form-control @error('seo_description') is-invalid @enderror" rows="2" maxlength="500">{{ old('seo_description') }}</textarea>
|
||||
@error('seo_description') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Palavras-chave SEO</label>
|
||||
<input type="text" name="seo_keywords" class="form-control @error('seo_keywords') is-invalid @enderror" value="{{ old('seo_keywords') }}" placeholder="palavra1, palavra2, palavra3">
|
||||
@error('seo_keywords') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Criar Notícia
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
document.getElementById('title').addEventListener('keyup', function() {
|
||||
let text = this.value.toLowerCase()
|
||||
.normalize('NFD').replace(/[\u0300-\u036f]/g, "")
|
||||
.replace(/[^\w ]+/g, '')
|
||||
.replace(/ +/g, '-');
|
||||
document.getElementById('slug').value = text;
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
Executable
+168
@@ -0,0 +1,168 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Notícia')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar Notícia: {{ $news->title }}</h1>
|
||||
<a href="{{ route('admin.news.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="row">
|
||||
<!-- News Settings -->
|
||||
<div class="col-lg-4">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Configurações</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.news.update', $news) }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Título</label>
|
||||
<input type="text" name="title" id="title" class="form-control" value="{{ old('title', $news->title) }}" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">URL (Slug)</label>
|
||||
<input type="text" name="slug" id="slug" class="form-control" value="{{ old('slug', $news->slug) }}" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Autor</label>
|
||||
<input type="text" name="author" class="form-control" value="{{ old('author', $news->author) }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Data/Hora de Publicação</label>
|
||||
<input type="datetime-local" name="published_at" class="form-control" value="{{ old('published_at', $news->published_at ? $news->published_at->format('Y-m-d\TH:i') : '') }}">
|
||||
<small class="text-muted">Vazio = publicação imediata.</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ $news->active ? 'selected' : '' }}>Ativa</option>
|
||||
<option value="0" {{ !$news->active ? 'selected' : '' }}>Inativa</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Imagem Principal</label>
|
||||
@if($news->featured_image)
|
||||
<div class="mb-2">
|
||||
<img src="{{ asset('storage/' . $news->featured_image) }}" alt="Featured" class="img-thumbnail" style="max-height: 120px;">
|
||||
</div>
|
||||
<a href="{{ route('admin.news.remove-featured', $news) }}" class="btn btn-sm btn-outline-danger mb-2" onclick="return confirm('Remover imagem principal?')">
|
||||
<i class="bi bi-x-lg"></i> Remover Imagem
|
||||
</a>
|
||||
@endif
|
||||
<input type="file" name="featured_image" class="form-control-file" accept="image/*">
|
||||
<small class="text-muted d-block mt-1">Envie uma nova imagem para substituir a atual.</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Resumo</label>
|
||||
<textarea name="summary" class="form-control" rows="2" maxlength="500">{{ old('summary', $news->summary) }}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Conteúdo</label>
|
||||
<textarea name="content" class="form-control" rows="8">{{ old('content', $news->content) }}</textarea>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<h6 class="small font-weight-bold text-muted">SEO</h6>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Título SEO</label>
|
||||
<input type="text" name="seo_title" class="form-control" value="{{ old('seo_title', $news->seo_title) }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Descrição SEO</label>
|
||||
<textarea name="seo_description" class="form-control" rows="2">{{ old('seo_description', $news->seo_description) }}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Palavras-chave SEO</label>
|
||||
<input type="text" name="seo_keywords" class="form-control" value="{{ old('seo_keywords', $news->seo_keywords) }}">
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block">Salvar Alterações</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Upload Additional Images -->
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3 bg-light">
|
||||
<h6 class="m-0 font-weight-bold text-dark">Adicionar Imagens</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.news.upload', $news) }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Selecionar Imagens</label>
|
||||
<input type="file" name="images[]" class="form-control-file" multiple accept="image/*" required>
|
||||
<small class="text-muted">Selecione uma ou mais imagens (máx. 5MB cada).</small>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-success btn-block">
|
||||
<i class="bi bi-upload me-1"></i> Enviar Imagens
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Additional Images List -->
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Imagens da Notícia</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
@forelse($news->images as $img)
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card h-100 border-0 shadow-sm overflow-hidden">
|
||||
<img src="{{ asset('storage/' . $img->file_path) }}" class="card-img-top" style="height: 150px; object-fit: cover;">
|
||||
<div class="card-body p-3">
|
||||
<form action="{{ route('admin.news.image.update', $img) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
<div class="form-group mb-2">
|
||||
<input type="text" name="description" class="form-control form-control-sm" value="{{ $img->description }}" placeholder="Descrição da imagem">
|
||||
</div>
|
||||
<div class="d-flex gap-2">
|
||||
<input type="number" name="order" class="form-control form-control-sm w-25" value="{{ $img->order }}" title="Ordem">
|
||||
<button type="submit" class="btn btn-sm btn-primary flex-grow-1">Salvar</button>
|
||||
</div>
|
||||
</form>
|
||||
<form action="{{ route('admin.news.image.delete', $img) }}" method="POST" class="mt-2">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-outline-danger btn-block" onclick="return confirm('Remover esta imagem?')">Excluir</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<div class="col-12 text-center py-5">
|
||||
<p class="text-muted">Nenhuma imagem adicional adicionada.</p>
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+101
@@ -0,0 +1,101 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Gerenciar Notícias')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">
|
||||
<i class="bi bi-newspaper me-2"></i>Notícias
|
||||
<span class="badge badge-{{ $newsEnabled ? 'success' : 'secondary' }} ml-2" style="font-size: 0.7rem;">
|
||||
{{ $newsEnabled ? 'Ativo' : 'Inativo' }}
|
||||
</span>
|
||||
</h1>
|
||||
<div class="d-flex gap-2">
|
||||
<form action="{{ route('admin.news.toggle') }}" method="POST">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-sm shadow-sm {{ $newsEnabled ? 'btn-outline-warning' : 'btn-outline-success' }}">
|
||||
<i class="bi bi-{{ $newsEnabled ? 'eye-slash' : 'eye' }} me-1"></i>
|
||||
{{ $newsEnabled ? 'Desativar Módulo' : 'Ativar Módulo' }}
|
||||
</button>
|
||||
</form>
|
||||
<a href="{{ route('admin.news.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Nova Notícia
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Notícias</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Imagem</th>
|
||||
<th>Título</th>
|
||||
<th>Autor</th>
|
||||
<th>Publicação</th>
|
||||
<th>Imagens</th>
|
||||
<th>Status</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($newsList as $item)
|
||||
<tr>
|
||||
<td>
|
||||
@if($item->featured_image)
|
||||
<img src="{{ asset('storage/' . $item->featured_image) }}" alt="{{ $item->title }}" style="width: 60px; height: 40px; object-fit: cover; border-radius: 4px;">
|
||||
@else
|
||||
<div class="bg-light d-flex align-items-center justify-content-center" style="width: 60px; height: 40px; border-radius: 4px;">
|
||||
<i class="bi bi-image text-muted"></i>
|
||||
</div>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ $item->title }}</td>
|
||||
<td>{{ $item->author ?? '—' }}</td>
|
||||
<td>
|
||||
@if($item->published_at)
|
||||
{{ $item->published_at->format('d/m/Y H:i') }}
|
||||
@else
|
||||
<span class="text-muted">—</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ $item->images_count }} imagens</td>
|
||||
<td>
|
||||
<span class="badge badge-{{ $item->active ? 'success' : 'secondary' }}">
|
||||
{{ $item->active ? 'Ativa' : 'Inativa' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.news.edit', $item) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i> Editar
|
||||
</a>
|
||||
<a href="{{ route('news.show', $item->slug) }}" target="_blank" class="btn btn-sm btn-info">
|
||||
<i class="bi bi-eye"></i> Ver
|
||||
</a>
|
||||
<form action="{{ route('admin.news.destroy', $item) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Excluir esta notícia e TODAS as suas imagens?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
{{ $newsList->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+116
@@ -0,0 +1,116 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Nova Página')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Nova Página</h1>
|
||||
<a href="{{ route('admin.pages.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Criar Conteúdo</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.pages.store') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título da Página</label>
|
||||
<input type="text" name="title" id="title" class="form-control @error('title') is-invalid @enderror" value="{{ old('title') }}" required>
|
||||
@error('title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Conteúdo (HTML)</label>
|
||||
<textarea name="content" id="editor" class="form-control @error('content') is-invalid @enderror" rows="15">{{ old('content') }}</textarea>
|
||||
@error('content') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Slug (URL amigável)</label>
|
||||
<input type="text" name="slug" id="slug" class="form-control @error('slug') is-invalid @enderror" value="{{ old('slug') }}" required>
|
||||
<small class="text-muted">Ex: minha-nova-pagina</small>
|
||||
@error('slug') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Meta Description (SEO)</label>
|
||||
<textarea name="meta_description" class="form-control @error('meta_description') is-invalid @enderror" rows="3">{{ old('meta_description') }}</textarea>
|
||||
@error('meta_description') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<h6 class="font-weight-bold text-primary mb-3"><i class="bi bi-search me-1"></i> SEO Adicional</h6>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Palavras-chave</label>
|
||||
<input type="text" name="meta_keywords" class="form-control form-control-sm" value="{{ old('meta_keywords') }}" placeholder="Ex: computador, assistência">
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">URL Canônica</label>
|
||||
<input type="text" name="canonical_url" class="form-control form-control-sm" value="{{ old('canonical_url') }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Status da Página</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ old('active', '1') == '1' ? 'selected' : '' }}>Ativa (Visível no site)</option>
|
||||
<option value="0" {{ old('active') == '0' ? 'selected' : '' }}>Inativa (Oculta)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Criar Página
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('css')
|
||||
<!-- Incluindo o editor Summernote para facilitar a edição HTML -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.css" rel="stylesheet">
|
||||
@endpush
|
||||
|
||||
@push('js')
|
||||
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#editor').summernote({
|
||||
height: 400,
|
||||
placeholder: 'Escreva o conteúdo da página aqui...',
|
||||
tabsize: 2,
|
||||
toolbar: [
|
||||
['style', ['style']],
|
||||
['font', ['bold', 'underline', 'clear']],
|
||||
['color', ['color']],
|
||||
['para', ['ul', 'ol', 'paragraph']],
|
||||
['table', ['table']],
|
||||
['insert', ['link', 'picture', 'video']],
|
||||
['view', ['fullscreen', 'codeview', 'help']]
|
||||
]
|
||||
});
|
||||
|
||||
// Gerar slug automaticamente a partir do título
|
||||
document.getElementById('title').addEventListener('keyup', function() {
|
||||
let text = this.value.toLowerCase()
|
||||
.normalize('NFD').replace(/[\u0300-\u036f]/g, "") // Remove acentos
|
||||
.replace(/[^\w ]+/g, '')
|
||||
.replace(/ +/g, '-');
|
||||
document.getElementById('slug').value = text;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
Executable
+176
@@ -0,0 +1,176 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Página')
|
||||
|
||||
@section('content')
|
||||
@php
|
||||
$managedPages = [
|
||||
'contato' => ['label' => 'Contato', 'route' => route('admin.contacts.index'), 'section' => 'Mensagens de Contato'],
|
||||
'faq' => ['label' => 'FAQ', 'route' => route('admin.faqs.index'), 'section' => 'Gerenciamento de FAQ'],
|
||||
'downloads' => ['label' => 'Downloads', 'route' => route('admin.downloads.index'), 'section' => 'Gerenciamento de Downloads'],
|
||||
'produtos' => ['label' => 'Produtos', 'route' => '#', 'section' => 'Módulo de Produtos'],
|
||||
'servicos' => ['label' => 'Serviços', 'route' => '#', 'section' => 'Módulo de Serviços'],
|
||||
];
|
||||
$isManaged = isset($managedPages[$page->slug]);
|
||||
@endphp
|
||||
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar Página: {{ $page->title }}</h1>
|
||||
<a href="{{ route('admin.pages.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if($isManaged)
|
||||
<div class="alert alert-warning border-0 shadow-sm mb-4">
|
||||
<div class="d-flex align-items-start">
|
||||
<i class="bi bi-exclamation-triangle me-3 mt-1"></i>
|
||||
<div>
|
||||
<h5 class="alert-heading mb-1">Página com conteúdo dinâmico</h5>
|
||||
<p class="mb-2">
|
||||
O conteúdo desta página (<strong>{{ $managedPages[$page->slug]['label'] }}</strong>) é gerado dinamicamente pelo sistema e <strong>não deve ser editado manualmente</strong> por aqui. As informações exibidas nela são controladas pela seção <strong>{{ $managedPages[$page->slug]['section'] }}</strong> no painel administrativo.
|
||||
</p>
|
||||
@if($managedPages[$page->slug]['route'] !== '#')
|
||||
<a href="{{ $managedPages[$page->slug]['route'] }}" class="btn btn-sm btn-warning">
|
||||
<i class="bi bi-box-arrow-up-right me-1"></i> Ir para {{ $managedPages[$page->slug]['section'] }}
|
||||
</a>
|
||||
@endif
|
||||
<p class="small text-muted mt-2 mb-0">
|
||||
<i class="bi bi-info-circle me-1"></i> Você ainda pode ajustar o título, slug, SEO e o status da página abaixo, mas o conteúdo principal será sobrescrito pelo módulo correspondente.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3 d-flex justify-content-between align-items-center">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Editar Conteúdo</h6>
|
||||
<a href="{{ url($page->slug == 'index' ? '/' : $page->slug) }}" target="_blank" class="btn btn-sm btn-info">
|
||||
<i class="bi bi-box-arrow-up-right"></i> Visualizar no Site
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.pages.update', $page) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título da Página</label>
|
||||
<input type="text" name="title" class="form-control @error('title') is-invalid @enderror" value="{{ old('title', $page->title) }}" required>
|
||||
@error('title') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3 {{ $isManaged ? 'opacity-50' : '' }}">
|
||||
<label class="font-weight-bold">
|
||||
Conteúdo (HTML)
|
||||
@if($isManaged)
|
||||
<span class="badge badge-warning ml-1"><i class="bi bi-lock me-1"></i>Gerenciado pelo sistema</span>
|
||||
@endif
|
||||
</label>
|
||||
<textarea name="content" id="editor" class="form-control @error('content') is-invalid @enderror" rows="20" {{ $isManaged ? 'disabled' : '' }}>{{ old('content', $page->content) }}</textarea>
|
||||
@error('content') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Slug (URL amigável)</label>
|
||||
<input type="text" name="slug" class="form-control @error('slug') is-invalid @enderror" value="{{ old('slug', $page->slug) }}" {{ in_array($page->slug, ['index', 'about', 'produtos', 'servicos', 'downloads', 'contato', 'faq']) ? 'readonly' : 'required' }}>
|
||||
<small class="text-muted">As páginas principais do sistema não podem ter o slug alterado.</small>
|
||||
@error('slug') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Meta Description (SEO)</label>
|
||||
<textarea name="meta_description" class="form-control @error('meta_description') is-invalid @enderror" rows="3">{{ old('meta_description', $page->meta_description) }}</textarea>
|
||||
@error('meta_description') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ old('active', $page->active) ? 'selected' : '' }}>Ativa (Visível)</option>
|
||||
<option value="0" {{ old('active', $page->active) ? '' : 'selected' }}>Inativa (Oculta)</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<h6 class="font-weight-bold text-primary mb-3"><i class="bi bi-search me-1"></i> Configurações Avançadas de SEO</h6>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">Palavras-chave (Keywords)</label>
|
||||
<input type="text" name="meta_keywords" class="form-control form-control-sm" value="{{ old('meta_keywords', $page->meta_keywords) }}" placeholder="computador, manutenção, vendas">
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="small font-weight-bold">URL Canônica</label>
|
||||
<input type="text" name="canonical_url" class="form-control form-control-sm" value="{{ old('canonical_url', $page->canonical_url) }}" placeholder="https://exemplo.com/pagina">
|
||||
</div>
|
||||
|
||||
<div class="bg-light p-3 rounded border">
|
||||
<h6 class="small font-weight-bold mb-2">Redes Sociais (Open Graph)</h6>
|
||||
<div class="form-group mb-2">
|
||||
<label class="x-small">Título OG</label>
|
||||
<input type="text" name="og_title" class="form-control form-control-sm" value="{{ old('og_title', $page->og_title) }}">
|
||||
</div>
|
||||
<div class="form-group mb-2">
|
||||
<label class="x-small">Descrição OG</label>
|
||||
<textarea name="og_description" class="form-control form-control-sm" rows="2">{{ old('og_description', $page->og_description) }}</textarea>
|
||||
</div>
|
||||
<div class="form-group mb-0">
|
||||
<label class="x-small">URL da Imagem OG</label>
|
||||
<input type="text" name="og_image" class="form-control form-control-sm" value="{{ old('og_image', $page->og_image) }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-block py-3 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Alterações
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('css')
|
||||
<!-- Incluindo o editor Summernote para facilitar a edição HTML -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.css" rel="stylesheet">
|
||||
@endpush
|
||||
|
||||
@push('js')
|
||||
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
@if($isManaged)
|
||||
// Disable editor for system-managed pages
|
||||
$('#editor').summernote({
|
||||
height: 400,
|
||||
disabled: true,
|
||||
placeholder: 'O conteúdo desta página é gerenciado automaticamente pelo sistema.',
|
||||
tabsize: 2,
|
||||
toolbar: []
|
||||
});
|
||||
@else
|
||||
$('#editor').summernote({
|
||||
height: 400,
|
||||
placeholder: 'Escreva o conteúdo da página aqui...',
|
||||
tabsize: 2,
|
||||
toolbar: [
|
||||
['style', ['style']],
|
||||
['font', ['bold', 'underline', 'clear']],
|
||||
['color', ['color']],
|
||||
['para', ['ul', 'ol', 'paragraph']],
|
||||
['table', ['table']],
|
||||
['insert', ['link', 'picture', 'video']],
|
||||
['view', ['fullscreen', 'codeview', 'help']]
|
||||
]
|
||||
});
|
||||
@endif
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
Executable
+75
@@ -0,0 +1,75 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Gerenciar Páginas')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Páginas Institucionais</h1>
|
||||
<a href="{{ route('admin.pages.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Nova Página
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Páginas</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Título</th>
|
||||
<th>Slug (URL)</th>
|
||||
<th>Status</th>
|
||||
<th>Última Atualização</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($pages as $page)
|
||||
@php
|
||||
$managedSlugs = ['contato', 'faq', 'downloads', 'produtos', 'servicos'];
|
||||
$isManaged = in_array($page->slug, $managedSlugs);
|
||||
@endphp
|
||||
<tr class="{{ $isManaged ? 'table-warning' : '' }}">
|
||||
<td>
|
||||
{{ $page->title }}
|
||||
@if($isManaged)
|
||||
<span class="badge badge-warning ml-1" title="Conteúdo gerenciado pelo sistema"><i class="bi bi-lock"></i> Sistema</span>
|
||||
@endif
|
||||
</td>
|
||||
<td><code>/{{ $page->slug }}</code></td>
|
||||
<td>
|
||||
<span class="badge badge-{{ $page->active ? 'success' : 'secondary' }}">
|
||||
{{ $page->active ? 'Ativa' : 'Inativa' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ $page->updated_at->format('d/m/Y H:i') }}</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.pages.edit', $page) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i> Editar
|
||||
</a>
|
||||
<a href="{{ url($page->slug == 'index' ? '/' : $page->slug) }}" target="_blank" class="btn btn-sm btn-info">
|
||||
<i class="bi bi-eye"></i> Ver
|
||||
</a>
|
||||
<form action="{{ route('admin.pages.destroy', $page) }}" method="POST" style="display: inline;">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Tem certeza que deseja excluir esta página?')">
|
||||
<i class="bi bi-trash"></i> Excluir
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+207
@@ -0,0 +1,207 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Configurações do Site')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Configurações Gerais</h1>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<form action="{{ route('admin.settings.update') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<!-- Nav Tabs -->
|
||||
<ul class="nav nav-tabs mb-4" id="settingsTabs" role="tablist">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active font-weight-bold" id="company-tab" data-toggle="tab" href="#company" role="tab"><i class="bi bi-building me-1"></i> Dados da Empresa</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link font-weight-bold" id="seo-tab" data-toggle="tab" href="#seo" role="tab"><i class="bi bi-globe me-1"></i> SEO Global</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link font-weight-bold" id="scripts-tab" data-toggle="tab" href="#scripts" role="tab"><i class="bi bi-code-slash me-1"></i> Scripts e Integrações</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link font-weight-bold" id="marketing-settings-tab" data-toggle="tab" href="#marketing-settings" role="tab"><i class="bi bi-megaphone me-1"></i> Marketing</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Tab Content -->
|
||||
<div class="tab-content" id="settingsTabsContent">
|
||||
<!-- Aba Dados da Empresa -->
|
||||
<div class="tab-pane fade show active" id="company" role="tabpanel">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações Institucionais</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome da Empresa</label>
|
||||
<input type="text" name="company_name" class="form-control" value="{{ \App\Models\Setting::get('company_name', 'Syspanel') }}">
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Slogan da Empresa</label>
|
||||
<input type="text" name="company_slogan" class="form-control" value="{{ \App\Models\Setting::get('company_slogan', 'Sua parceira em tecnologia e manutenção de informática.') }}">
|
||||
<small class="text-muted">Aparece no rodapé e em outros locais</small>
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">CNPJ</label>
|
||||
<input type="text" name="company_cnpj" class="form-control" value="{{ \App\Models\Setting::get('company_cnpj') }}" placeholder="00.000.000/0000-00">
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">E-mail de Contato Principal</label>
|
||||
<input type="email" name="company_email" class="form-control" value="{{ \App\Models\Setting::get('company_email') }}">
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Telefone / WhatsApp</label>
|
||||
<input type="text" name="company_phone" class="form-control" value="{{ \App\Models\Setting::get('company_phone') }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Endereço Completo</label>
|
||||
<textarea name="company_address" class="form-control" rows="2">{{ \App\Models\Setting::get('company_address') }}</textarea>
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Horário de Atendimento</label>
|
||||
<input type="text" name="company_hours" class="form-control" value="{{ \App\Models\Setting::get('company_hours') }}" placeholder="Seg a Sex: 08h às 18h">
|
||||
</div>
|
||||
<hr>
|
||||
<h6 class="font-weight-bold text-dark mb-3">Redes Sociais (Links completos)</h6>
|
||||
<div class="form-group mb-2">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend"><span class="input-group-text"><i class="bi bi-instagram"></i></span></div>
|
||||
<input type="text" name="company_instagram" class="form-control" value="{{ \App\Models\Setting::get('company_instagram') }}" placeholder="https://instagram.com/perfil">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mb-2">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend"><span class="input-group-text"><i class="bi bi-facebook"></i></span></div>
|
||||
<input type="text" name="company_facebook" class="form-control" value="{{ \App\Models\Setting::get('company_facebook') }}" placeholder="https://facebook.com/perfil">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mb-0">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend"><span class="input-group-text"><i class="bi bi-linkedin"></i></span></div>
|
||||
<input type="text" name="company_linkedin" class="form-control" value="{{ \App\Models\Setting::get('company_linkedin') }}" placeholder="https://linkedin.com/company/perfil">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h6 class="font-weight-bold text-dark mb-3"><i class="bi bi-geo-alt me-1"></i> Mapa de Localização</h6>
|
||||
<div class="form-group mb-0">
|
||||
<label class="font-weight-bold">Iframe do Google Maps</label>
|
||||
<textarea name="company_map_iframe" class="form-control" rows="4" placeholder="Cole aqui o código iframe do Google Maps...">{{ \App\Models\Setting::get('company_map_iframe') }}</textarea>
|
||||
<small class="text-muted">Vá no Google Maps, compartilhe o local e selecione "Incorporar mapa" para obter o código iframe. Aparece na página de Contato.</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Aba SEO Global -->
|
||||
<div class="tab-pane fade" id="seo" role="tabpanel">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Configurações de Buscadores</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Título do Site (Sufixo)</label>
|
||||
<input type="text" name="seo_title_suffix" class="form-control" value="{{ \App\Models\Setting::get('seo_title_suffix', ' - Syspanel') }}">
|
||||
<small class="text-muted">Ex: "Início - Syspanel"</small>
|
||||
</div>
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição Meta Padrão</label>
|
||||
<textarea name="seo_description_default" class="form-control" rows="3">{{ \App\Models\Setting::get('seo_description_default') }}</textarea>
|
||||
</div>
|
||||
<div class="form-group mb-0">
|
||||
<label class="font-weight-bold">Imagem OG Padrão (URL)</label>
|
||||
<input type="text" name="seo_og_image_default" class="form-control" value="{{ \App\Models\Setting::get('seo_og_image_default') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Aba Scripts -->
|
||||
<div class="tab-pane fade" id="scripts" role="tabpanel">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Integrações e Código</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Google Analytics (Tag ID)</label>
|
||||
<input type="text" name="scripts_google_analytics" class="form-control" value="{{ \App\Models\Setting::get('scripts_google_analytics') }}" placeholder="G-XXXXXXXXXX">
|
||||
</div>
|
||||
<div class="form-group mb-0">
|
||||
<label class="font-weight-bold">Scripts Adicionais no <head></label>
|
||||
<textarea name="scripts_head_custom" class="form-control" rows="6" placeholder="Ex: Meta-tags de verificação, CSS customizado">{{ \App\Models\Setting::get('scripts_head_custom') }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Aba Marketing -->
|
||||
<div class="tab-pane fade" id="marketing-settings" role="tabpanel">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="card shadow mb-4 border-left-warning">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-warning">Textos de Divulgação (WhatsApp / Redes Sociais)</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-4">
|
||||
<label class="font-weight-bold text-success"><i class="bi bi-whatsapp me-1"></i> Texto para Produtos</label>
|
||||
<textarea name="marketing_product_text" class="form-control" rows="4">{{ \App\Models\Setting::get('marketing_product_text', 'Confira este produto incrível: {name} por apenas R$ {price}. Veja mais detalhes aqui: {link}') }}</textarea>
|
||||
<small class="text-muted">Use as tags: <strong>{name}</strong> para o nome, <strong>{price}</strong> para o preço e <strong>{link}</strong> para a URL do produto.</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-4">
|
||||
<label class="font-weight-bold text-primary"><i class="bi bi-bell me-1"></i> Texto para Serviços</label>
|
||||
<textarea name="marketing_service_text" class="form-control" rows="4">{{ \App\Models\Setting::get('marketing_service_text', 'Precisa de {name}? Nós podemos te ajudar! Confira nossos serviços aqui: {link}') }}</textarea>
|
||||
<small class="text-muted">Use as tags: <strong>{name}</strong> para o nome e <strong>{link}</strong> para a URL da página de serviços.</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-body text-right">
|
||||
<button type="submit" class="btn btn-primary px-5 py-2 fw-bold">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Todas as Configurações
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@endsection
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Novo Assunto')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Novo Assunto</h1>
|
||||
<a href="{{ route('admin.subjects.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-6">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Criar Assunto para Contato</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.subjects.store') }}" method="POST">
|
||||
@csrf
|
||||
<div class="form-group mb-4">
|
||||
<label class="font-weight-bold">Nome do Assunto</label>
|
||||
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name') }}" placeholder="Ex: Suporte Técnico, Vendas..." required>
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-2 fw-bold shadow-sm">
|
||||
<i class="bi bi-check-lg me-1"></i> Criar Assunto
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Assunto')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar Assunto</h1>
|
||||
<a href="{{ route('admin.subjects.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-6">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Assunto: {{ $subject->name }}</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.subjects.update', $subject) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome do Assunto</label>
|
||||
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name', $subject->name) }}" required>
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<label class="font-weight-bold">Status</label>
|
||||
<select name="active" class="form-control">
|
||||
<option value="1" {{ old('active', $subject->active) ? 'selected' : '' }}>Ativo (Visível no site)</option>
|
||||
<option value="0" {{ old('active', $subject->active) ? '' : 'selected' }}>Inativo (Oculto no site)</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-2 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Alterações
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Assuntos de Contato')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Assuntos</h1>
|
||||
<a href="{{ route('admin.subjects.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Novo Assunto
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
@if(session('error'))
|
||||
<div class="alert alert-danger border-0 shadow-sm">{{ session('error') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Assuntos</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nome</th>
|
||||
<th>Status</th>
|
||||
<th>Mensagens</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($subjects as $subject)
|
||||
<tr>
|
||||
<td>{{ $subject->name }}</td>
|
||||
<td>
|
||||
<span class="badge badge-{{ $subject->active ? 'success' : 'secondary' }}">
|
||||
{{ $subject->active ? 'Ativo' : 'Inativo' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ $subject->messages_count ?? $subject->messages()->count() }}</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.subjects.edit', $subject) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<form action="{{ route('admin.subjects.destroy', $subject) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Tem certeza que deseja excluir este assunto?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Novo Tipo de Usuário')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Novo Tipo de Usuário</h1>
|
||||
<a href="{{ route('admin.user-types.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-6">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Criar Tipo de Usuário</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.user-types.store') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome do Tipo</label>
|
||||
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name') }}" required placeholder="Ex: Editor, Moderador, Visualizador">
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<small class="text-muted mt-1 d-block">Este nome será usado como identificador do tipo de usuário.</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição</label>
|
||||
<textarea name="description" class="form-control @error('description') is-invalid @enderror" rows="3" placeholder="Descreva o que este tipo de usuário pode fazer">{{ old('description') }}</textarea>
|
||||
@error('description') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" name="is_admin" class="custom-control-input" id="is_admin" {{ old('is_admin') ? 'checked' : '' }}>
|
||||
<label class="custom-control-label font-weight-bold text-danger" for="is_admin">Tipo Administrador</label>
|
||||
<small class="d-block text-muted">Quando ativado, usuários deste tipo terão acesso total ao sistema (todas as permissões).</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-2 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Criar Tipo
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Tipo de Usuário')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar Tipo: {{ $userType->name }}</h1>
|
||||
<a href="{{ route('admin.user-types.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-6">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Editar Tipo de Usuário</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.user-types.update', $userType) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome do Tipo</label>
|
||||
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name', $userType->name) }}" required>
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
@if($userType->is_protected)
|
||||
<small class="text-warning mt-1 d-block"><i class="bi bi-exclamation-triangle"></i> Este é um tipo protegido. Alterar o nome afetará todos os usuários deste tipo.</small>
|
||||
@else
|
||||
<small class="text-muted mt-1 d-block">Alterar o nome atualizará automaticamente todos os usuários deste tipo.</small>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Descrição</label>
|
||||
<textarea name="description" class="form-control @error('description') is-invalid @enderror" rows="3">{{ old('description', $userType->description) }}</textarea>
|
||||
@error('description') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" name="is_admin" class="custom-control-input" id="is_admin" {{ old('is_admin', $userType->is_admin) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label font-weight-bold text-danger" for="is_admin">Tipo Administrador</label>
|
||||
<small class="d-block text-muted">Quando ativado, usuários deste tipo terão acesso total ao sistema (todas as permissões).</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-2 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Alterações
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Tipos de Usuário')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Tipos de Usuário</h1>
|
||||
<a href="{{ route('admin.user-types.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Novo Tipo
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
@if(session('error'))
|
||||
<div class="alert alert-danger border-0 shadow-sm">{{ session('error') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Tipos de Usuário</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nome</th>
|
||||
<th>Descrição</th>
|
||||
<th>Administrador</th>
|
||||
<th>Protegido</th>
|
||||
<th>Usuários</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($userTypes as $type)
|
||||
<tr>
|
||||
<td>
|
||||
<span class="font-weight-bold">{{ $type->name }}</span>
|
||||
</td>
|
||||
<td>{{ $type->description ?? '-' }}</td>
|
||||
<td>
|
||||
@if($type->is_admin)
|
||||
<span class="badge badge-danger">Sim</span>
|
||||
@else
|
||||
<span class="badge badge-secondary">Não</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if($type->is_protected)
|
||||
<span class="badge badge-warning"><i class="bi bi-lock"></i> Sim</span>
|
||||
@else
|
||||
<span class="badge badge-light">Não</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-info">{{ $type->users_count }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.user-types.edit', $type) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
@unless($type->is_protected)
|
||||
<form action="{{ route('admin.user-types.destroy', $type) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Tem certeza que deseja excluir este tipo de usuário?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
@endunless
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+138
@@ -0,0 +1,138 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Novo Usuário')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Novo Usuário</h1>
|
||||
<a href="{{ route('admin.users.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Criar Novo Cadastro</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.users.store') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome Completo</label>
|
||||
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name') }}" required placeholder="Ex: João Silva">
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">E-mail</label>
|
||||
<input type="email" name="email" class="form-control @error('email') is-invalid @enderror" value="{{ old('email') }}" required placeholder="email@exemplo.com">
|
||||
@error('email') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Senha Inicial</label>
|
||||
<div class="input-group">
|
||||
<input type="password" name="password" class="form-control @error('password') is-invalid @enderror" required placeholder="Mínimo 8 caracteres">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary toggle-password" type="button">
|
||||
<i class="bi bi-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
@error('password') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<label class="font-weight-bold">Tipo de Usuário</label>
|
||||
<a href="{{ route('admin.user-types.index') }}" class="text-small text-decoration-none"><i class="bi bi-gear"></i> Gerenciar Tipos</a>
|
||||
</div>
|
||||
<select name="user_type" id="user_type" class="form-control @error('user_type') is-invalid @enderror" required>
|
||||
@foreach($userTypes as $type)
|
||||
<option value="{{ $type->name }}" {{ old('user_type') === $type->name ? 'selected' : '' }}>{{ $type->name }}@if($type->is_admin) (Admin)@endif</option>
|
||||
@endforeach
|
||||
</select>
|
||||
@error('user_type') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<small class="text-muted mt-1 d-block">Tipos marcados como Admin têm acesso total ao sistema. Os demais têm acesso apenas às seções permitidas abaixo.</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Empresa</label>
|
||||
<input type="text" name="company" class="form-control @error('company') is-invalid @enderror" value="{{ old('company') }}" placeholder="Opcional">
|
||||
@error('company') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">Site</label>
|
||||
<input type="text" name="website" class="form-control @error('website') is-invalid @enderror" value="{{ old('website') }}" placeholder="Opcional">
|
||||
@error('website') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">WhatsApp</label>
|
||||
<input type="text" name="whatsapp" class="form-control @error('whatsapp') is-invalid @enderror" value="{{ old('whatsapp') }}" placeholder="Opcional">
|
||||
@error('whatsapp') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Permissions Section -->
|
||||
<div id="permissions-section">
|
||||
<hr class="my-4">
|
||||
<h6 class="font-weight-bold text-primary mb-3"><i class="bi bi-shield-check me-1"></i> Permissões de Acesso</h6>
|
||||
<p class="text-muted small mb-3">Selecione quais seções do sistema este usuário poderá acessar. Esta configuração se aplica apenas a usuários do tipo <strong>User</strong>.</p>
|
||||
|
||||
<div class="row">
|
||||
@foreach($availablePermissions as $key => $label)
|
||||
<div class="col-md-6 mb-2">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" name="permissions[]" value="{{ $key }}" id="perm_{{ $key }}" class="custom-control-input permission-check" {{ in_array($key, old('permissions', [])) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="perm_{{ $key }}">{{ $label }}</label>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="mt-2 mb-3">
|
||||
<button type="button" id="select-all-perms" class="btn btn-sm btn-outline-primary me-2">Selecionar Todas</button>
|
||||
<button type="button" id="deselect-all-perms" class="btn btn-sm btn-outline-secondary">Desmarcar Todas</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-2 fw-bold shadow-sm">
|
||||
<i class="bi bi-plus-lg me-1"></i> Cadastrar Usuário
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
function togglePermissions() {
|
||||
var userType = $('#user_type').val();
|
||||
if (userType === 'Admin') {
|
||||
$('#permissions-section').slideUp();
|
||||
} else {
|
||||
$('#permissions-section').slideDown();
|
||||
}
|
||||
}
|
||||
|
||||
$('#user_type').change(togglePermissions);
|
||||
togglePermissions();
|
||||
|
||||
$('#select-all-perms').click(function() {
|
||||
$('.permission-check').prop('checked', true);
|
||||
});
|
||||
|
||||
$('#deselect-all-perms').click(function() {
|
||||
$('.permission-check').prop('checked', false);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@endsection
|
||||
Executable
+168
@@ -0,0 +1,168 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Editar Usuário')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Editar Usuário: {{ $user->name }}</h1>
|
||||
<a href="{{ route('admin.users.index') }}" class="btn btn-sm btn-secondary shadow-sm">
|
||||
<i class="bi bi-arrow-left text-white-50 me-1"></i> Voltar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações de {{ $user->name }}</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('admin.users.update', $user) }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome</label>
|
||||
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name', $user->name) }}" required>
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">E-mail (Não editável)</label>
|
||||
<input type="email" class="form-control bg-light" value="{{ $user->email }}" readonly>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Data de Confirmação do Cadastro</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light"><i class="bi bi-calendar-check text-success"></i></span>
|
||||
<input type="text" class="form-control bg-light"
|
||||
value="{{ $user->email_verified_at ? $user->email_verified_at->format('d/m/Y H:i:s') : 'Pendente de Confirmação' }}"
|
||||
readonly>
|
||||
</div>
|
||||
@if(!$user->email_verified_at)
|
||||
<small class="text-danger mt-1 d-block"><i class="bi bi-exclamation-triangle"></i> Este usuário ainda não confirmou o e-mail.</small>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<label class="font-weight-bold">Tipo de Usuário</label>
|
||||
<a href="{{ route('admin.user-types.index') }}" class="text-small text-decoration-none"><i class="bi bi-gear"></i> Gerenciar Tipos</a>
|
||||
</div>
|
||||
<select name="user_type" id="user_type" class="form-control @error('user_type') is-invalid @enderror" required>
|
||||
@foreach($userTypes as $type)
|
||||
<option value="{{ $type->name }}" {{ old('user_type', $user->user_type) === $type->name ? 'selected' : '' }}>{{ $type->name }}@if($type->is_admin) (Admin)@endif</option>
|
||||
@endforeach
|
||||
</select>
|
||||
@error('user_type') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
<small class="text-muted mt-1 d-block">Tipos marcados como Admin têm acesso total ao sistema. Os demais têm acesso apenas às seções permitidas abaixo.</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Empresa</label>
|
||||
<input type="text" name="company" class="form-control @error('company') is-invalid @enderror" value="{{ old('company', $user->company) }}">
|
||||
@error('company') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">Site</label>
|
||||
<input type="text" name="website" class="form-control @error('website') is-invalid @enderror" value="{{ old('website', $user->website) }}">
|
||||
@error('website') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">WhatsApp</label>
|
||||
<input type="text" name="whatsapp" class="form-control @error('whatsapp') is-invalid @enderror" value="{{ old('whatsapp', $user->whatsapp) }}">
|
||||
@error('whatsapp') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="my-4">
|
||||
<h6 class="font-weight-bold text-danger mb-3"><i class="bi bi-lock me-1"></i> Alterar Senha (Opcional)</h6>
|
||||
<p class="text-muted small mb-3">Preencha os campos abaixo apenas se desejar alterar a senha deste usuário. Caso contrário, deixe-os em branco.</p>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">Nova Senha</label>
|
||||
<div class="input-group">
|
||||
<input type="password" name="password" class="form-control @error('password') is-invalid @enderror" placeholder="Mínimo 8 caracteres" autocomplete="new-password">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary toggle-password" type="button">
|
||||
<i class="bi bi-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
@error('password') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">Confirmar Nova Senha</label>
|
||||
<div class="input-group">
|
||||
<input type="password" name="password_confirmation" class="form-control" placeholder="Repita a nova senha" autocomplete="new-password">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary toggle-password" type="button">
|
||||
<i class="bi bi-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Permissions Section -->
|
||||
<div id="permissions-section">
|
||||
<hr class="my-4">
|
||||
<h6 class="font-weight-bold text-primary mb-3"><i class="bi bi-shield-check me-1"></i> Permissões de Acesso</h6>
|
||||
<p class="text-muted small mb-3">Selecione quais seções do sistema este usuário poderá acessar. Esta configuração se aplica apenas a usuários do tipo <strong>User</strong>.</p>
|
||||
|
||||
<div class="row">
|
||||
@foreach($availablePermissions as $key => $label)
|
||||
<div class="col-md-6 mb-2">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" name="permissions[]" value="{{ $key }}" id="perm_{{ $key }}" class="custom-control-input permission-check" {{ in_array($key, old('permissions', $user->permissions ?? [])) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="perm_{{ $key }}">{{ $label }}</label>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="mt-2 mb-3">
|
||||
<button type="button" id="select-all-perms" class="btn btn-sm btn-outline-primary me-2">Selecionar Todas</button>
|
||||
<button type="button" id="deselect-all-perms" class="btn btn-sm btn-outline-secondary">Desmarcar Todas</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-2 fw-bold shadow-sm mt-3">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Alterações
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
function togglePermissions() {
|
||||
var userType = $('#user_type').val();
|
||||
if (userType === 'Admin') {
|
||||
$('#permissions-section').slideUp();
|
||||
} else {
|
||||
$('#permissions-section').slideDown();
|
||||
}
|
||||
}
|
||||
|
||||
$('#user_type').change(togglePermissions);
|
||||
togglePermissions();
|
||||
|
||||
$('#select-all-perms').click(function() {
|
||||
$('.permission-check').prop('checked', true);
|
||||
});
|
||||
|
||||
$('#deselect-all-perms').click(function() {
|
||||
$('.permission-check').prop('checked', false);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@endsection
|
||||
Executable
+100
@@ -0,0 +1,100 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Gerenciar Cadastros')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Administração de Usuários</h1>
|
||||
<div>
|
||||
<a href="{{ route('admin.user-types.index') }}" class="btn btn-sm btn-outline-secondary shadow-sm me-2">
|
||||
<i class="bi bi-tags"></i> Tipos de Usuário
|
||||
</a>
|
||||
<a href="{{ route('admin.users.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="bi bi-plus-lg text-white-50"></i> Novo Usuário
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
@if(session('error'))
|
||||
<div class="alert alert-danger border-0 shadow-sm">{{ session('error') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Lista de Usuários</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nome</th>
|
||||
<th>E-mail</th>
|
||||
<th>Tipo</th>
|
||||
<th>Permissões</th>
|
||||
<th>Empresa</th>
|
||||
<th>WhatsApp</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($users as $user)
|
||||
<tr>
|
||||
<td>{{ $user->name }}</td>
|
||||
<td>{{ $user->email }}</td>
|
||||
<td>
|
||||
@php
|
||||
$typeIsAdmin = false;
|
||||
foreach($userTypes as $ut) {
|
||||
if ($ut->name === $user->user_type && $ut->is_admin) {
|
||||
$typeIsAdmin = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@endphp
|
||||
<span class="badge badge-{{ $typeIsAdmin ? 'danger' : 'primary' }}">
|
||||
{{ $user->user_type }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
@if($user->isAdmin())
|
||||
<span class="badge badge-success">Acesso Total</span>
|
||||
@elseif(is_array($user->permissions) && count($user->permissions) > 0)
|
||||
@foreach($user->permissions as $perm)
|
||||
@if(isset($availablePermissions[$perm]))
|
||||
<span class="badge badge-info me-1 mb-1" title="{{ $availablePermissions[$perm] }}">{{ $availablePermissions[$perm] }}</span>
|
||||
@endif
|
||||
@endforeach
|
||||
@else
|
||||
<span class="text-muted small">Nenhuma permissão</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ $user->company ?? '-' }}</td>
|
||||
<td>{{ $user->whatsapp ?? '-' }}</td>
|
||||
<td>
|
||||
<a href="{{ route('admin.users.edit', $user) }}" class="btn btn-sm btn-primary">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<form action="{{ route('admin.users.destroy', $user) }}" method="POST" class="d-inline">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Tem certeza que deseja excluir este usuário?')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
{{ $users->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+178
@@ -0,0 +1,178 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title ?? 'Assistentes Digitais com IA - Syspanel')
|
||||
@section('meta_description', $page->meta_description ?? 'Entenda o que são Assistentes Digitais com IA e suas utilidades práticas para o dia a dia.')
|
||||
|
||||
@section('content')
|
||||
<style>
|
||||
/* Padronização com a página Linux */
|
||||
.hero-gradient-ia {
|
||||
background: linear-gradient(135deg, #232526 0%, #414345 100%);
|
||||
}
|
||||
.ia-card {
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
transition: all 0.3s ease;
|
||||
background: #fff;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,0.05);
|
||||
}
|
||||
.ia-card:hover {
|
||||
transform: translateY(-10px);
|
||||
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
|
||||
}
|
||||
.icon-box {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background: rgba(13, 110, 253, 0.1);
|
||||
color: #0d6efd;
|
||||
border-radius: 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
.ia-badge {
|
||||
background: #e9ecef;
|
||||
color: #495057;
|
||||
padding: 0.4rem 1rem;
|
||||
border-radius: 50px;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
display: inline-block;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
.section-divider {
|
||||
height: 4px;
|
||||
width: 60px;
|
||||
background: #0d6efd;
|
||||
margin: 1.5rem 0;
|
||||
border-radius: 2px;
|
||||
}
|
||||
@keyframes floating {
|
||||
0% { transform: translateY(0px); }
|
||||
50% { transform: translateY(-20px); }
|
||||
100% { transform: translateY(0px); }
|
||||
}
|
||||
.floating-animation {
|
||||
animation: floating 3s ease-in-out infinite;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<section class="hero-gradient-ia py-5 text-white position-relative overflow-hidden">
|
||||
<div class="container py-5 position-relative z-2">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-7">
|
||||
<span class="badge bg-warning text-dark px-3 py-2 rounded-pill fw-bold mb-3 shadow">TECNOLOGIA DE PONTA</span>
|
||||
<h1 class="display-3 fw-bold mb-4">Assistentes Digitais de Alta Performance</h1>
|
||||
<p class="lead opacity-90 mb-5">
|
||||
Entenda como a Inteligência Artificial transformou simples chatbots em agentes cognitivos capazes de entender, aprender e agir de forma autônoma.
|
||||
</p>
|
||||
<div class="d-flex gap-3">
|
||||
<a href="#vantagens" class="btn btn-primary btn-lg px-4 rounded-pill fw-bold shadow">Ver Utilidades</a>
|
||||
<a href="{{ route('contato') }}" class="btn btn-outline-light btn-lg px-4 rounded-pill fw-bold">Solicitar Orçamento</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-5 text-center d-none d-lg-block">
|
||||
<i class="bi bi-robot text-white opacity-10 floating-animation"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- O que é? -->
|
||||
<section id="vantagens" class="py-5 bg-white">
|
||||
<div class="container py-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-6">
|
||||
<h2 class="display-5 fw-bold mb-4">O que é um Assistente Digital?</h2>
|
||||
<div class="section-divider"></div>
|
||||
<p class="text-muted fs-5 mb-4">
|
||||
Muito além de um simples robô de respostas, os assistentes digitais modernos utilizam processamento de linguagem natural para interagir de forma inteligente:
|
||||
</p>
|
||||
<ul class="list-unstyled">
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-check-circle text-success mt-1 me-3"></i>
|
||||
<div><strong>Compreensão Real:</strong> Entendem o contexto e a intenção por trás das palavras, não apenas palavras-chave isoladas.</div>
|
||||
</li>
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-check-circle text-success mt-1 me-3"></i>
|
||||
<div><strong>Aprendizado Contínuo:</strong> Evoluem a cada conversa, tornando-se mais precisos e inteligentes com o tempo.</div>
|
||||
</li>
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-check-circle text-success mt-1 me-3"></i>
|
||||
<div><strong>Integração de Dados:</strong> Conectam-se a bases de conhecimento para fornecer informações exatas em milissegundos.</div>
|
||||
</li>
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-check-circle text-success mt-1 me-3"></i>
|
||||
<div><strong>Execução de Tarefas:</strong> Podem agir de forma autônoma para realizar agendamentos e triagens.</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="row g-4">
|
||||
<div class="col-md-6">
|
||||
<div class="ia-card p-4 h-100">
|
||||
<div class="icon-box">
|
||||
<i class="bi bi-cpu"></i>
|
||||
</div>
|
||||
<h4 class="fw-bold">Cognição</h4>
|
||||
<p class="text-muted small">Arquitetura inspirada no processamento humano para resolver problemas complexos.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="ia-card p-4 h-100">
|
||||
<div class="icon-box">
|
||||
<i class="bi bi-lightning"></i>
|
||||
</div>
|
||||
<h4 class="fw-bold">Agilidade</h4>
|
||||
<p class="text-muted small">Respostas imediatas e precisas que eliminam filas de espera e aumentam a satisfação.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Diagnóstico e Consultoria -->
|
||||
<section class="py-5 bg-dark text-white">
|
||||
<div class="container py-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-6 mb-4 mb-lg-0">
|
||||
<h2 class="display-5 fw-bold mb-4">Pronto para o Próximo Nível?</h2>
|
||||
<p class="lead opacity-75 mb-4">A inteligência artificial é a ferramenta indispensável para quem busca escala hoje.</p>
|
||||
<div class="d-flex mb-3">
|
||||
<div class="me-3"><i class="bi bi-diagram-3 text-warning"></i></div>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-1">Arquitetura Personalizada</h5>
|
||||
<p class="small opacity-75">Implementações que respeitam sua identidade e regras de negócio.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex mb-3">
|
||||
<div class="me-3"><i class="bi bi-lock text-warning"></i></div>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-1">Privacidade e Segurança</h5>
|
||||
<p class="small opacity-75">Processamento seguro de informações em total conformidade.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex">
|
||||
<div class="me-3"><i class="bi bi-arrow-repeat text-warning"></i></div>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-1">Evolução Contínua</h5>
|
||||
<p class="small opacity-75">Acompanhamento constante para refinamento da base de conhecimento.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6 px-lg-5">
|
||||
<div class="p-5 bg-white bg-opacity-10 rounded-4 backdrop-blur-sm border border-white border-opacity-10 shadow-lg">
|
||||
<h4 class="fw-bold mb-4">Solicite um Diagnóstico</h4>
|
||||
<p class="small mb-4">Nossa equipe analisará seus processos atuais e proporemos a melhor solução de IA.</p>
|
||||
<a href="{{ route('contato') }}" class="btn btn-warning w-100 fw-bold py-3 rounded-pill shadow">Falar com Especialista</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@endsection
|
||||
Executable
+88
@@ -0,0 +1,88 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Login - Syspanel')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center align-items-center" style="min-height: 70vh;">
|
||||
<div class="col-md-5">
|
||||
<div class="card border-0 shadow-lg rounded-4 overflow-hidden">
|
||||
<div class="row g-0">
|
||||
<div class="col-12 bg-primary p-5 text-white text-center">
|
||||
<i class="bi bi-cpu fs-1 mb-3"></i>
|
||||
<h2 class="fw-bold">Bem-vindo de volta!</h2>
|
||||
<p class="mb-0 text-white-50">Acesse sua conta para gerenciar seus serviços.</p>
|
||||
</div>
|
||||
<div class="col-12 p-5 bg-white">
|
||||
@if(session('error'))
|
||||
<div class="alert alert-danger border-0 shadow-sm mb-4">
|
||||
{{ session('error') }}
|
||||
</div>
|
||||
@endif
|
||||
<form method="POST" action="{{ route('login') }}">
|
||||
@csrf
|
||||
<div class="mb-4">
|
||||
<label for="email" class="form-label fw-bold">E-mail</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-envelope text-muted"></i></span>
|
||||
<input type="email" class="form-control bg-light border-start-0 ps-0 @error('email') is-invalid @enderror" id="email" name="email" value="{{ old('email') }}" placeholder="seu@email.com" required autocomplete="email" autofocus>
|
||||
@error('email')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<div class="d-flex justify-content-between">
|
||||
<label for="password" class="form-label fw-bold">Senha</label>
|
||||
@if (Route::has('password.request'))
|
||||
<a href="{{ route('password.request') }}" class="text-decoration-none small">Esqueceu a senha?</a>
|
||||
@endif
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-lock text-muted"></i></span>
|
||||
<input type="password" class="form-control bg-light border-start-0 border-end-0 ps-0 @error('password') is-invalid @enderror" id="password" name="password" placeholder="••••••••" required autocomplete="current-password">
|
||||
<button class="btn btn-light border-start-0 toggle-password" type="button">
|
||||
<i class="bi bi-eye text-muted"></i>
|
||||
</button>
|
||||
@error('password')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="remember" name="remember" {{ old('remember') ? 'checked' : '' }}>
|
||||
<label class="form-check-label text-muted" for="remember">Lembrar de mim</label>
|
||||
</div>
|
||||
|
||||
@include('partials.captcha')
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-lg w-100 py-3 fw-bold shadow-sm rounded-pill mb-4">
|
||||
Entrar
|
||||
</button>
|
||||
|
||||
@if(Route::has('register') && \App\Models\Setting::get('public_registration') == 'on')
|
||||
<div class="text-center">
|
||||
<span class="text-muted">Não tem uma conta?</span>
|
||||
<a href="{{ route('register') }}" class="text-decoration-none fw-bold">Cadastre-se</a>
|
||||
</div>
|
||||
@endif
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-4">
|
||||
<a href="{{ route('index') }}" class="text-muted text-decoration-none small">
|
||||
<i class="bi bi-arrow-left"></i> Voltar para o site
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-header">{{ __('Confirm Password') }}</div>
|
||||
|
||||
<div class="card-body">
|
||||
{{ __('Please confirm your password before continuing.') }}
|
||||
|
||||
<form method="POST" action="{{ route('password.confirm') }}">
|
||||
@csrf
|
||||
|
||||
<div class="row mb-3">
|
||||
<label for="password" class="col-md-4 col-form-label text-md-end">{{ __('Password') }}</label>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="input-group">
|
||||
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
|
||||
<button class="btn btn-outline-secondary toggle-password" type="button">
|
||||
<i class="bi bi-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@error('password')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-0">
|
||||
<div class="col-md-8 offset-md-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{{ __('Confirm Password') }}
|
||||
</button>
|
||||
|
||||
@if (Route::has('password.request'))
|
||||
<a class="btn btn-link" href="{{ route('password.request') }}">
|
||||
{{ __('Forgot Your Password?') }}
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Recuperar Senha - Syspanel')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center align-items-center" style="min-height: 70vh;">
|
||||
<div class="col-md-5">
|
||||
<div class="card border-0 shadow-lg rounded-4 overflow-hidden">
|
||||
<div class="bg-primary p-5 text-white text-center">
|
||||
<i class="bi bi-key fs-1 mb-3"></i>
|
||||
<h2 class="fw-bold">Recuperar Senha</h2>
|
||||
<p class="mb-0 text-white-50">Enviaremos um link para você redefinir sua senha.</p>
|
||||
</div>
|
||||
<div class="card-body p-5 bg-white">
|
||||
@if (session('status'))
|
||||
<div class="alert alert-success border-0 shadow-sm rounded-3 mb-4" role="alert">
|
||||
{{ session('status') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<form method="POST" action="{{ route('password.email') }}">
|
||||
@csrf
|
||||
|
||||
<div class="mb-4">
|
||||
<label for="email" class="form-label fw-bold">Endereço de E-mail</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-envelope text-muted"></i></span>
|
||||
<input id="email" type="email" class="form-control bg-light border-start-0 ps-0 @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus placeholder="seu@email.com">
|
||||
@error('email')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@include('partials.captcha')
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-lg w-100 py-3 fw-bold shadow-sm rounded-pill mb-4">
|
||||
Enviar Link de Recuperação
|
||||
</button>
|
||||
|
||||
<div class="text-center">
|
||||
<a href="{{ route('login') }}" class="text-decoration-none fw-bold">Voltar para o Login</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Redefinir Senha - Syspanel')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center align-items-center" style="min-height: 70vh;">
|
||||
<div class="col-md-5">
|
||||
<div class="card border-0 shadow-lg rounded-4 overflow-hidden">
|
||||
<div class="bg-primary p-5 text-white text-center">
|
||||
<i class="bi bi-shield-lock fs-1 mb-3"></i>
|
||||
<h2 class="fw-bold">Redefinir Senha</h2>
|
||||
<p class="mb-0 text-white-50">Crie uma nova senha para sua conta.</p>
|
||||
</div>
|
||||
<div class="card-body p-5 bg-white">
|
||||
<form method="POST" action="{{ route('password.update') }}">
|
||||
@csrf
|
||||
|
||||
<input type="hidden" name="token" value="{{ $token }}">
|
||||
|
||||
<div class="mb-4">
|
||||
<label for="email" class="form-label fw-bold">Endereço de E-mail</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-envelope text-muted"></i></span>
|
||||
<input id="email" type="email" class="form-control bg-light border-start-0 ps-0 @error('email') is-invalid @enderror" name="email" value="{{ $email ?? old('email') }}" required autocomplete="email" autofocus placeholder="seu@email.com">
|
||||
@error('email')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<label for="password" class="form-label fw-bold">Nova Senha</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-lock text-muted"></i></span>
|
||||
<input id="password" type="password" class="form-control bg-light border-start-0 border-end-0 ps-0 @error('password') is-invalid @enderror" name="password" required autocomplete="new-password" placeholder="••••••••">
|
||||
<button class="btn btn-light border-start-0 toggle-password" type="button">
|
||||
<i class="bi bi-eye text-muted"></i>
|
||||
</button>
|
||||
@error('password')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<label for="password-confirm" class="form-label fw-bold">Confirmar Nova Senha</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-lock-fill text-muted"></i></span>
|
||||
<input id="password-confirm" type="password" class="form-control bg-light border-start-0 border-end-0 ps-0" name="password_confirmation" required autocomplete="new-password" placeholder="••••••••">
|
||||
<button class="btn btn-light border-start-0 toggle-password" type="button">
|
||||
<i class="bi bi-eye text-muted"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@include('partials.captcha')
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-lg w-100 py-3 fw-bold shadow-sm rounded-pill">
|
||||
Redefinir Senha
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+152
@@ -0,0 +1,152 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Cadastro - Syspanel')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center align-items-center" style="min-height: 70vh;">
|
||||
<div class="col-md-6">
|
||||
<div class="card border-0 shadow-lg rounded-4 overflow-hidden">
|
||||
<div class="row g-0">
|
||||
<div class="col-12 bg-primary p-4 text-white text-center">
|
||||
<i class="bi bi-person-plus fs-1 mb-2"></i>
|
||||
<h2 class="fw-bold">Crie sua conta</h2>
|
||||
<p class="mb-0 text-white-50">Junte-se à Syspanel e gerencie seus serviços.</p>
|
||||
</div>
|
||||
<div class="col-12 p-5 bg-white">
|
||||
<form method="POST" action="{{ route('register') }}">
|
||||
@csrf
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="name" class="form-label fw-bold">Nome Completo</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-person text-muted"></i></span>
|
||||
<input id="name" type="text" class="form-control bg-light border-start-0 ps-0 @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus placeholder="Seu nome">
|
||||
@error('name')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="email" class="form-label fw-bold">E-mail</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-envelope text-muted"></i></span>
|
||||
<input id="email" type="email" class="form-control bg-light border-start-0 ps-0 @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" placeholder="seu@email.com">
|
||||
@error('email')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="user_type" class="form-label fw-bold">Tipo de Usuário</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-person-badge text-muted"></i></span>
|
||||
<select id="user_type" class="form-select bg-light border-start-0 ps-0 @error('user_type') is-invalid @enderror" name="user_type" required>
|
||||
<option value="" disabled {{ old('user_type') ? '' : 'selected' }}>Selecione o tipo</option>
|
||||
<option value="User" {{ old('user_type') == 'User' ? 'selected' : '' }}>Usuário (User)</option>
|
||||
<option value="Admin" {{ old('user_type') == 'Admin' ? 'selected' : '' }}>Administrador (Admin)</option>
|
||||
</select>
|
||||
@error('user_type')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="company" class="form-label fw-bold">Empresa (Opcional)</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-building text-muted"></i></span>
|
||||
<input id="company" type="text" class="form-control bg-light border-start-0 ps-0 @error('company') is-invalid @enderror" name="company" value="{{ old('company') }}" placeholder="Nome da empresa">
|
||||
@error('company')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="website" class="form-label fw-bold">Site (Opcional)</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-globe text-muted"></i></span>
|
||||
<input id="website" type="text" class="form-control bg-light border-start-0 ps-0 @error('website') is-invalid @enderror" name="website" value="{{ old('website') }}" placeholder="https://exemplo.com">
|
||||
@error('website')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="whatsapp" class="form-label fw-bold">WhatsApp (Opcional)</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-whatsapp text-muted"></i></span>
|
||||
<input id="whatsapp" type="text" class="form-control bg-light border-start-0 ps-0 @error('whatsapp') is-invalid @enderror" name="whatsapp" value="{{ old('whatsapp') }}" placeholder="(00) 00000-0000">
|
||||
@error('whatsapp')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="password" class="form-label fw-bold">Senha</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-lock text-muted"></i></span>
|
||||
<input id="password" type="password" class="form-control bg-light border-start-0 border-end-0 ps-0 @error('password') is-invalid @enderror" name="password" required autocomplete="new-password" placeholder="••••••••">
|
||||
<button class="btn btn-light border-start-0 toggle-password" type="button">
|
||||
<i class="bi bi-eye text-muted"></i>
|
||||
</button>
|
||||
@error('password')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="password-confirm" class="form-label fw-bold">Confirmar Senha</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-lock-fill text-muted"></i></span>
|
||||
<input id="password-confirm" type="password" class="form-control bg-light border-start-0 border-end-0 ps-0" name="password_confirmation" required autocomplete="new-password" placeholder="••••••••">
|
||||
<button class="btn btn-light border-start-0 toggle-password" type="button">
|
||||
<i class="bi bi-eye text-muted"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 small text-muted">
|
||||
Ao se cadastrar, você concorda com nossos <a href="#" class="text-decoration-none">Termos de Uso</a>.
|
||||
</div>
|
||||
|
||||
@include('partials.captcha')
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-lg w-100 py-3 fw-bold shadow-sm rounded-pill mb-4">
|
||||
Cadastrar Agora
|
||||
</button>
|
||||
|
||||
<div class="text-center">
|
||||
<span class="text-muted">Já tem uma conta?</span>
|
||||
<a href="{{ route('login') }}" class="text-decoration-none fw-bold">Faça login</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Verificar E-mail - Syspanel')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center align-items-center" style="min-height: 70vh;">
|
||||
<div class="col-md-6">
|
||||
<div class="card border-0 shadow-lg rounded-4 overflow-hidden text-center">
|
||||
<div class="bg-primary p-5 text-white">
|
||||
<i class="bi bi-envelope-check fs-1 mb-3"></i>
|
||||
<h2 class="fw-bold">Verifique seu E-mail</h2>
|
||||
<p class="mb-0 text-white-50">Enviamos um link de confirmação para o seu endereço de e-mail.</p>
|
||||
</div>
|
||||
<div class="card-body p-5 bg-white">
|
||||
@if (session('resent'))
|
||||
<div class="alert alert-success border-0 shadow-sm rounded-3 mb-4" role="alert">
|
||||
{{ __('Um novo link de verificação foi enviado para o seu endereço de e-mail.') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<p class="lead text-muted mb-4">
|
||||
Antes de prosseguir, por favor verifique seu e-mail em busca do link de confirmação.
|
||||
Se você não recebeu o e-mail, clique no botão abaixo para solicitar outro.
|
||||
</p>
|
||||
|
||||
<form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-primary btn-lg px-5 py-3 fw-bold shadow-sm rounded-pill">
|
||||
Reenviar E-mail de Verificação
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+218
@@ -0,0 +1,218 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page ? $page->title : 'Contato')
|
||||
@section('meta_description', $page ? $page->meta_description : 'Entre em contato com a Syspanel.')
|
||||
@section('meta_keywords', $page ? $page->meta_keywords : '')
|
||||
@section('og_title', $page ? $page->og_title : '')
|
||||
@section('og_description', $page ? $page->og_description : '')
|
||||
@section('og_image', $page ? $page->og_image : '')
|
||||
@section('canonical', $page ? $page->canonical_url : '')
|
||||
|
||||
@section('content')
|
||||
<!-- Breadcrumb -->
|
||||
<nav aria-label="breadcrumb" class="bg-light py-3 border-bottom mb-5 shadow-sm">
|
||||
<div class="container">
|
||||
<ol class="breadcrumb mb-0">
|
||||
<li class="breadcrumb-item"><a href="{{ route('home') }}" class="text-decoration-none">Início</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">Contato</li>
|
||||
</ol>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<section class="py-5 mb-5">
|
||||
<div class="container">
|
||||
<h2 class="display-4 fw-bold text-center mb-5 text-primary">Fale Conosco</h2>
|
||||
|
||||
<div class="row g-5">
|
||||
<!-- Informações de Contato -->
|
||||
<div class="col-lg-5 order-lg-2">
|
||||
<div class="bg-primary text-white p-5 rounded-4 shadow-lg h-100">
|
||||
<h3 class="fw-bold mb-4">Informações de Contato</h3>
|
||||
<p class="mb-4">Entre em contato conosco para tirar dúvidas, solicitar orçamentos ou agendar uma visita técnica.</p>
|
||||
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<i class="bi bi-geo-alt fs-2 me-4 text-light"></i>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-0">Localização</h5>
|
||||
<p class="mb-0">{{ $company->address ?? 'Endereço não informado' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<i class="bi bi-telephone fs-2 me-4 text-light"></i>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-0">Telefone e WhatsApp</h5>
|
||||
<p class="mb-0">{{ $company->phone ?? 'Não informado' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<i class="bi bi-envelope fs-2 me-4 text-light"></i>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-0">E-mail</h5>
|
||||
<p class="mb-0">{{ $company->email ?? 'Não informado' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-center">
|
||||
<i class="bi bi-clock fs-2 me-4 text-light"></i>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-0">Horário de Atendimento</h5>
|
||||
<p class="mb-0 text-white-50">{{ $company->hours ?? 'Não informado' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="my-5 border-light border-2 opacity-25">
|
||||
|
||||
<h5 class="fw-bold mb-4">Redes Sociais</h5>
|
||||
<div class="d-flex gap-3 fs-3">
|
||||
@if($company->facebook)
|
||||
<a href="{{ $company->facebook }}" class="text-white text-decoration-none hover-scale" target="_blank"><i class="bi bi-facebook"></i></a>
|
||||
@endif
|
||||
@if($company->instagram)
|
||||
<a href="{{ $company->instagram }}" class="text-white text-decoration-none hover-scale" target="_blank"><i class="bi bi-instagram"></i></a>
|
||||
@endif
|
||||
@if($company->linkedin)
|
||||
<a href="{{ $company->linkedin }}" class="text-white text-decoration-none hover-scale" target="_blank"><i class="bi bi-linkedin"></i></a>
|
||||
@endif
|
||||
@if($company->phone)
|
||||
<a href="https://wa.me/{{ preg_replace('/\D/', '', $company->phone) }}" class="text-white text-decoration-none hover-scale" target="_blank"><i class="bi bi-whatsapp"></i></a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Formulário de Contato -->
|
||||
<div class="col-lg-7 order-lg-1">
|
||||
<div class="bg-white p-5 border border-light-subtle rounded-4 shadow-sm h-100">
|
||||
<h3 class="fw-bold mb-4 text-dark">Envie uma Mensagem</h3>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<form action="{{ route('contato.send') }}" method="POST">
|
||||
@csrf
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<div class="form-floating mb-3">
|
||||
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror" id="name" value="{{ old('name') }}" placeholder="Seu Nome Completo" required>
|
||||
<label for="name">Seu Nome</label>
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-floating mb-3">
|
||||
<input type="email" name="email" class="form-control @error('email') is-invalid @enderror" id="email" value="{{ old('email') }}" placeholder="nome@exemplo.com" required>
|
||||
<label for="email">Seu E-mail</label>
|
||||
@error('email') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-floating mb-3">
|
||||
<input type="text" name="company" class="form-control @error('company') is-invalid @enderror" id="company" value="{{ old('company') }}" placeholder="Nome da Empresa">
|
||||
<label for="company">Sua Empresa (Opcional)</label>
|
||||
@error('company') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-floating mb-3">
|
||||
<input type="text" name="website" class="form-control @error('website') is-invalid @enderror" id="website" value="{{ old('website') }}" placeholder="https://exemplo.com">
|
||||
<label for="website">Seu Site (Opcional)</label>
|
||||
@error('website') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-floating mb-3">
|
||||
<input type="tel" name="whatsapp" class="form-control @error('whatsapp') is-invalid @enderror" id="whatsapp" value="{{ old('whatsapp') }}" placeholder="(11) 98765-4321">
|
||||
<label for="whatsapp">Seu WhatsApp</label>
|
||||
@error('whatsapp') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-floating mb-3">
|
||||
<select name="subject_id" class="form-select @error('subject_id') is-invalid @enderror" id="subject" required>
|
||||
<option value="" disabled {{ old('subject_id') ? '' : 'selected' }}>Selecione um Assunto</option>
|
||||
@foreach($subjects as $subject)
|
||||
<option value="{{ $subject->id }}" {{ old('subject_id') == $subject->id ? 'selected' : '' }}>{{ $subject->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
<label for="subject">Assunto</label>
|
||||
@error('subject_id') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="form-floating mb-4">
|
||||
<textarea name="message" class="form-control @error('message') is-invalid @enderror" placeholder="Escreva sua mensagem aqui" id="message" style="height: 150px" required>{{ old('message') }}</textarea>
|
||||
<label for="message">Sua Mensagem</label>
|
||||
@error('message') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sistema de Captcha Simples -->
|
||||
<div class="col-12 mb-4">
|
||||
<div class="p-3 bg-light rounded-3 border">
|
||||
<label class="form-label fw-bold mb-2">Verificação de Segurança</label>
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
@php
|
||||
$n1 = rand(1, 9);
|
||||
$n2 = rand(1, 9);
|
||||
session(['captcha_result' => $n1 + $n2]);
|
||||
@endphp
|
||||
<div class="bg-white px-3 py-2 rounded border fw-bold fs-5 shadow-sm text-primary" style="letter-spacing: 2px;">
|
||||
{{ $n1 }} + {{ $n2 }} = ?
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<input type="number" name="captcha" class="form-control form-control-lg @error('captcha') is-invalid @enderror" placeholder="Resultado" required>
|
||||
@error('captcha') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<small class="text-muted mt-2 d-block">Por favor, resolva a conta acima para provar que você não é um robô.</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<button type="submit" class="btn btn-primary btn-lg w-100 py-3 fw-bold shadow-sm rounded-pill">Enviar Mensagem</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@php
|
||||
$mapIframe = \App\Models\Setting::get('company_map_iframe');
|
||||
// Sanitize iframe: only allow iframes from trusted domains
|
||||
$allowedDomains = ['google.com', 'maps.google.com', 'www.google.com', 'openstreetmap.org', 'www.openstreetmap.org'];
|
||||
$safeIframe = null;
|
||||
|
||||
if ($mapIframe && preg_match('/<iframe[^>]*src=["\']https?:\/\/([^"\']+)["\'][^>]*>/i', $mapIframe, $matches)) {
|
||||
$iframeDomain = parse_url('https://' . $matches[1], PHP_URL_HOST);
|
||||
$isTrusted = false;
|
||||
|
||||
foreach ($allowedDomains as $allowed) {
|
||||
if (str_ends_with($iframeDomain, $allowed)) {
|
||||
$isTrusted = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($isTrusted) {
|
||||
$safeIframe = $mapIframe;
|
||||
}
|
||||
}
|
||||
@endphp
|
||||
@if($safeIframe)
|
||||
<section class="py-0 mb-5 border-top">
|
||||
<div class="container-fluid p-0">
|
||||
<div class="map-responsive">
|
||||
{!! $safeIframe !!}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
@endsection
|
||||
Executable
+88
@@ -0,0 +1,88 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title)
|
||||
@section('meta_description', $page->meta_description)
|
||||
@section('meta_keywords', $page->meta_keywords)
|
||||
@section('og_title', $page->og_title)
|
||||
@section('og_description', $page->og_description)
|
||||
@section('og_image', $page->og_image)
|
||||
@section('canonical', $page->canonical_url)
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-4 fw-bold text-primary">Downloads e Utilitários</h1>
|
||||
<p class="lead text-muted">Arquivos exclusivos para nossos clientes cadastrados.</p>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-10">
|
||||
@guest
|
||||
<div class="card border-0 shadow-sm rounded-4 bg-light p-5 text-center">
|
||||
<div class="mb-4">
|
||||
<i class="bi bi-lock-fill display-1 text-primary"></i>
|
||||
</div>
|
||||
<h2 class="fw-bold mb-3">Acesso Restrito</h2>
|
||||
<p class="lead text-muted mb-4">
|
||||
Para garantir a segurança e integridade dos arquivos, a área de downloads é exclusiva para usuários cadastrados.
|
||||
</p>
|
||||
<div class="d-grid gap-3 d-sm-flex justify-content-sm-center">
|
||||
<a href="{{ route('login') }}" class="btn btn-primary btn-lg px-5 py-3 rounded-pill fw-bold">Fazer Login</a>
|
||||
<a href="{{ route('register') }}" class="btn btn-outline-primary btn-lg px-5 py-3 rounded-pill fw-bold">Criar Conta Grátis</a>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<div class="card border-0 shadow-sm rounded-4 overflow-hidden">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover align-middle mb-0">
|
||||
<thead class="bg-primary text-white">
|
||||
<tr>
|
||||
<th class="ps-4 py-3">Arquivo</th>
|
||||
<th class="py-3">Tipo</th>
|
||||
<th class="py-3">Descrição</th>
|
||||
<th class="py-3 text-center">Ação</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($downloads as $download)
|
||||
<tr>
|
||||
<td class="ps-4">
|
||||
<div class="fw-bold text-dark">{{ $download->title }}</div>
|
||||
<small class="text-muted">Postado em {{ $download->created_at->format('d/m/Y') }}</small>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge bg-light text-primary border border-primary-subtle px-3 py-2">
|
||||
<i class="bi bi-file-earmark-arrow-down me-1"></i> {{ $download->file_type }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-muted small">
|
||||
{{ $download->description ?? 'Sem descrição disponível.' }}
|
||||
</td>
|
||||
<td class="text-center pe-4">
|
||||
<a href="{{ route('downloads.file', $download) }}" class="btn btn-primary rounded-pill px-4 fw-bold">
|
||||
<i class="bi bi-download me-1"></i> Baixar
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="4" class="text-center py-5 text-muted">
|
||||
<i class="bi bi-folder2-open fs-1 d-block mb-3"></i>
|
||||
Nenhum arquivo disponível para download no momento.
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info border-0 shadow-sm mt-4 rounded-3">
|
||||
<i class="bi bi-info-circle-fill me-2"></i>
|
||||
<strong>Dica:</strong> Se não encontrar o driver específico para seu equipamento, entre em contato com nosso <a href="{{ route('contato') }}" class="alert-link text-decoration-underline">suporte técnico</a>.
|
||||
</div>
|
||||
@endguest
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
||||
.container { width: 100%; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #eee; border-radius: 10px; }
|
||||
.header { background-color: #0d6efd; color: white; padding: 20px; text-align: center; border-radius: 10px 10px 0 0; }
|
||||
.content { padding: 30px; background-color: #f9f9f9; }
|
||||
.footer { padding: 20px; text-align: center; font-size: 12px; color: #777; }
|
||||
.original-message { margin-top: 30px; padding: 15px; border-left: 4px solid #ddd; font-style: italic; color: #666; background-color: #fff; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<h2>Resposta ao seu Contato</h2>
|
||||
</div>
|
||||
<div class="content">
|
||||
<p>Olá, <strong>{{ $contact->name }}</strong>,</p>
|
||||
|
||||
<p>{{ $replyMessage }}</p>
|
||||
|
||||
<div class="original-message">
|
||||
<p><strong>Sua mensagem original:</strong></p>
|
||||
<p>{{ $contact->message }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<p>Atenciosamente,<br>Equipe {{ config('app.name') }}</p>
|
||||
<p>© {{ date('Y') }} Syspanel. Todos os direitos reservados.</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
<x-mail::message>
|
||||
# {{ $subjectLine }}
|
||||
|
||||
@if($productImage)
|
||||
<img src="{{ $productImage }}" style="width: 100%; max-width: 600px; height: auto; border-radius: 8px; margin-bottom: 20px;" alt="Promoção">
|
||||
@endif
|
||||
|
||||
{!! $messageBody !!}
|
||||
|
||||
@if($buttonUrl)
|
||||
<x-mail::button :url="$buttonUrl">
|
||||
{{ $buttonText ?: 'Confira agora' }}
|
||||
</x-mail::button>
|
||||
@endif
|
||||
|
||||
Obrigado,<br>
|
||||
Equipe {{ $company->name ?? config('app.name') }}
|
||||
</x-mail::message>
|
||||
Executable
+313
@@ -0,0 +1,313 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title ?? 'ERP Syspanel - Gestão Inteligente')
|
||||
@section('meta_description', $page->meta_description ?? 'Descubra como o ERP Syspanel pode transformar a gestão da sua empresa com módulos personalizados e inteligência artificial.')
|
||||
@section('meta_keywords', $page->meta_keywords ?? 'ERP, Sistema de Gestão, Gestão Empresarial, Automação, Syspanel, Financeiro, CRM')
|
||||
@section('og_title', $page->og_title ?? 'ERP Syspanel - Gestão Inteligente')
|
||||
@section('og_description', $page->og_description ?? 'A solução completa para a gestão total do seu negócio.')
|
||||
@section('og_image', $page->og_image ?? '')
|
||||
@section('canonical', $page->canonical_url ?? '')
|
||||
|
||||
@section('content')
|
||||
<style>
|
||||
.hero-gradient-erp {
|
||||
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
|
||||
}
|
||||
.erp-feature-icon {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background: rgba(13, 110, 253, 0.1);
|
||||
color: #0d6efd;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 1.5rem;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
.erp-card {
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
transition: all 0.3s ease;
|
||||
background: #fff;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,0.05);
|
||||
}
|
||||
.erp-card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 15px 35px rgba(0,0,0,0.1);
|
||||
}
|
||||
.benefit-card {
|
||||
border-radius: 25px;
|
||||
overflow: hidden;
|
||||
border: 1px solid rgba(0,0,0,0.05);
|
||||
}
|
||||
.benefit-header {
|
||||
padding: 1.5rem;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.module-badge {
|
||||
background: #e9ecef;
|
||||
color: #495057;
|
||||
padding: 0.4rem 1rem;
|
||||
border-radius: 50px;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
display: inline-block;
|
||||
margin: 0.25rem;
|
||||
}
|
||||
.custom-modules-section {
|
||||
background: #f8f9fa;
|
||||
border-radius: 30px;
|
||||
padding: 4rem 2rem;
|
||||
border: 2px dashed #dee2e6;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<section class="hero-gradient-erp py-5 min-vh-50 d-flex align-items-center text-white">
|
||||
<div class="container py-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-7">
|
||||
<span class="badge bg-warning text-dark px-3 py-2 rounded-pill fw-bold mb-3">SISTEMA DE GESTÃO COMPLETO</span>
|
||||
<h1 class="display-3 fw-bold mb-4">ERP Syspanel: Inteligência em Cada Processo</h1>
|
||||
<p class="lead opacity-90 mb-5">
|
||||
A solução definitiva para integrar todos os setores da sua empresa. Do financeiro à produção, com módulos personalizados que crescem com o seu negócio.
|
||||
</p>
|
||||
<div class="d-flex gap-3">
|
||||
<a href="#vantagens" class="btn btn-warning btn-lg px-4 rounded-pill fw-bold text-dark">Conhecer Vantagens</a>
|
||||
<a href="{{ route('contato') }}" class="btn btn-outline-light btn-lg px-4 rounded-pill fw-bold">Solicitar Proposta</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-5 text-center d-none d-lg-block">
|
||||
<i class="bi bi-pie-chart opacity-20 floating-animation"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- O que é ERP -->
|
||||
<section class="py-5">
|
||||
<div class="container py-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-6">
|
||||
<h2 class="display-5 fw-bold mb-4">O que é um ERP?</h2>
|
||||
<p class="text-muted fs-5 mb-4">
|
||||
ERP (Enterprise Resource Planning) é um sistema que centraliza todas as informações e processos de uma empresa em uma única plataforma. Imagine ter financeiro, vendas, estoque, RH e produção conversando entre si em tempo real.
|
||||
</p>
|
||||
<p class="text-muted fs-5">
|
||||
O <strong>ERP Syspanel</strong> vai além: ele utiliza Inteligência Artificial para analisar seus dados e sugerir melhorias, tornando sua gestão não apenas organizada, mas estratégica.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="row g-3">
|
||||
<div class="col-6">
|
||||
<div class="erp-card p-4 text-center">
|
||||
<div class="erp-feature-icon mx-auto"><i class="bi bi-link-45deg"></i></div>
|
||||
<h5 class="fw-bold">Integração</h5>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="erp-card p-4 text-center">
|
||||
<div class="erp-feature-icon mx-auto text-success"><i class="bi bi-lightning"></i></div>
|
||||
<h5 class="fw-bold">Agilidade</h5>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="erp-card p-4 text-center">
|
||||
<div class="erp-feature-icon mx-auto text-info"><i class="bi bi-shield-check"></i></div>
|
||||
<h5 class="fw-bold">Segurança</h5>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="erp-card p-4 text-center">
|
||||
<div class="erp-feature-icon mx-auto text-warning"><i class="bi bi-lightbulb"></i></div>
|
||||
<h5 class="fw-bold">Inteligência</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Vantagens -->
|
||||
<section id="vantagens" class="py-5 bg-light">
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h2 class="display-5 fw-bold">Vantagens do Ecossistema</h2>
|
||||
<p class="text-muted">Como o ERP Syspanel beneficia todos os envolvidos no seu negócio</p>
|
||||
</div>
|
||||
|
||||
<div class="row g-4">
|
||||
<!-- Empresário -->
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="benefit-card bg-white h-100 shadow-sm">
|
||||
<div class="benefit-header bg-primary text-white">Para o Empresário</div>
|
||||
<div class="p-4">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-primary mt-1 me-2"></i><span>Visão 360º do negócio em tempo real.</span></li>
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-primary mt-1 me-2"></i><span>Redução drástica de erros e retrabalho.</span></li>
|
||||
<li class="mb-0 d-flex align-items-start"><i class="bi bi-check-lg text-primary mt-1 me-2"></i><span>Decisões seguras baseadas em indicadores (KPIs).</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Funcionários -->
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="benefit-card bg-white h-100 shadow-sm">
|
||||
<div class="benefit-header bg-success text-white">Para os Funcionários</div>
|
||||
<div class="p-4">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-success mt-1 me-2"></i><span>Automação de tarefas repetitivas.</span></li>
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-success mt-1 me-2"></i><span>Facilidade no acesso a informações necessárias.</span></li>
|
||||
<li class="mb-0 d-flex align-items-start"><i class="bi bi-check-lg text-success mt-1 me-2"></i><span>Ambiente de trabalho mais organizado e produtivo.</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Empresa -->
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="benefit-card bg-white h-100 shadow-sm">
|
||||
<div class="benefit-header bg-dark text-white">Para a Empresa</div>
|
||||
<div class="p-4">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-dark mt-1 me-2"></i><span>Processos padronizados e auditáveis.</span></li>
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-dark mt-1 me-2"></i><span>Melhoria contínua da saúde financeira.</span></li>
|
||||
<li class="mb-0 d-flex align-items-start"><i class="bi bi-check-lg text-dark mt-1 me-2"></i><span>Crescimento sustentável e escalável.</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Clientes -->
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="benefit-card bg-white h-100 shadow-sm">
|
||||
<div class="benefit-header bg-info text-white">Para os Clientes</div>
|
||||
<div class="p-4">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-info mt-1 me-2"></i><span>Atendimento mais rápido e preciso.</span></li>
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-info mt-1 me-2"></i><span>Transparência em pedidos e entregas.</span></li>
|
||||
<li class="mb-0 d-flex align-items-start"><i class="bi bi-check-lg text-info mt-1 me-2"></i><span>Melhor experiência de compra/serviço.</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Fornecedores -->
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="benefit-card bg-white h-100 shadow-sm">
|
||||
<div class="benefit-header bg-warning text-dark">Para os Fornecedores</div>
|
||||
<div class="p-4">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-warning mt-1 me-2"></i><span>Previsibilidade de demanda e pedidos.</span></li>
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-warning mt-1 me-2"></i><span>Gestão eficiente de recebimentos.</span></li>
|
||||
<li class="mb-0 d-flex align-items-start"><i class="bi bi-check-lg text-warning mt-1 me-2"></i><span>Parceria baseada em dados reais.</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Nuvem vs Local -->
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="benefit-card bg-white h-100 shadow-sm">
|
||||
<div class="benefit-header bg-primary text-white"><i class="bi bi-cloud me-2"></i>ERP em Nuvem</div>
|
||||
<div class="p-4">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-primary mt-1 me-2"></i><span><strong>Sem Custos de Hardware:</strong> Não necessita de servidores próprios ou TI local.</span></li>
|
||||
<li class="mb-3 d-flex align-items-start"><i class="bi bi-check-lg text-primary mt-1 me-2"></i><span><strong>Acesso Global:</strong> Trabalhe de qualquer lugar, a qualquer hora, com segurança total.</span></li>
|
||||
<li class="mb-0 d-flex align-items-start"><i class="bi bi-check-lg text-primary mt-1 me-2"></i><span><strong>Atualizações Automáticas:</strong> Seu sistema sempre na última versão, sem paradas.</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Módulos e Personalização -->
|
||||
<section class="py-5">
|
||||
<div class="container py-5">
|
||||
<div class="row mb-5">
|
||||
<div class="col-12">
|
||||
<h2 class="display-5 fw-bold mb-3">Módulos que Evoluem com Você</h2>
|
||||
<p class="text-muted fs-5">Nosso sistema é modular. Você começa com o que precisa e expande conforme sua necessidade.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mb-5">
|
||||
<div class="col-12">
|
||||
<div class="d-flex flex-wrap">
|
||||
<span class="module-badge"><i class="bi bi-cash-stack me-2"></i>Financeiro</span>
|
||||
<span class="module-badge"><i class="bi bi-arrow-left-right me-2"></i>Fluxo de Caixa</span>
|
||||
<span class="module-badge"><i class="bi bi-persons me-2"></i>CRM</span>
|
||||
<span class="module-badge"><i class="bi bi-cart me-2"></i>Vendas</span>
|
||||
<span class="module-badge"><i class="bi bi-bag me-2"></i>Compras</span>
|
||||
<span class="module-badge"><i class="bi bi-list-task me-2"></i>Gestão de Projetos</span>
|
||||
<span class="module-badge"><i class="bi bi-graph-up me-2"></i>Plano de Negócios</span>
|
||||
<span class="module-badge"><i class="bi bi-boxes me-2"></i>Estoque</span>
|
||||
<span class="module-badge"><i class="bi bi-building me-2"></i>Produção</span>
|
||||
<span class="module-badge"><i class="bi bi-gears me-2"></i>Produção (PCP)</span>
|
||||
<span class="module-badge"><i class="bi bi-truck me-2"></i>Frotas</span>
|
||||
<span class="module-badge"><i class="bi bi-car-front me-2"></i>Controle de Veículos</span>
|
||||
<span class="module-badge"><i class="bi bi-person-badge me-2"></i>RH</span>
|
||||
<span class="module-badge"><i class="bi bi-robot me-2 text-danger"></i>IA ERP</span>
|
||||
<span class="module-badge"><i class="bi bi-check2-all me-2"></i>Qualidade</span>
|
||||
<span class="module-badge"><i class="bi bi-plus-lg-circle me-2"></i>Outros</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="custom-modules-section text-center shadow-sm mb-5">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="erp-feature-icon mx-auto bg-primary text-white mb-4">
|
||||
<i class="bi bi-puzzle"></i>
|
||||
</div>
|
||||
<h3 class="fw-bold mb-3">Necessidade Única? Módulo Novo!</h3>
|
||||
<p class="text-muted fs-5 mb-0">
|
||||
Sua empresa tem um processo exclusivo? Nós desenvolvemos e <strong>acrescentamos novos módulos conforme a necessidade específica da sua empresa</strong>. O ERP se molda ao seu negócio, não o contrário.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Fluxo de Caixa Pro Highlight -->
|
||||
<div class="card border-0 shadow-lg rounded-4 overflow-hidden">
|
||||
<div class="row g-0">
|
||||
<div class="col-lg-4 bg-success d-flex align-items-center justify-content-center p-5 text-white">
|
||||
<div class="text-center">
|
||||
<i class="bi bi-cash-coin mb-3"></i>
|
||||
<h3 class="fw-bold">Fluxo de Caixa Pro</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8 p-5">
|
||||
<span class="badge bg-success bg-opacity-10 text-success px-3 py-2 rounded-pill fw-bold mb-3">SOLUÇÃO ESPECIALIZADA</span>
|
||||
<h3 class="fw-bold mb-3">Domine suas Finanças com Precisão Cirúrgica</h3>
|
||||
<p class="text-muted fs-5 mb-4">
|
||||
Para empresas que buscam um controle financeiro ainda mais profundo, oferecemos o <strong>Fluxo de Caixa Pro</strong>. Uma ferramenta dedicada para DRE gerencial, conciliação bancária automática e projeções de caixa avançadas.
|
||||
</p>
|
||||
<a href="https://fluxodecaixapro.syspanel.com.br" target="_blank" class="btn btn-success btn-lg rounded-pill fw-bold px-5">
|
||||
<i class="bi bi-box-arrow-up-right me-2"></i>Conhecer Fluxo de Caixa Pro
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA -->
|
||||
<section class="py-5">
|
||||
<div class="container">
|
||||
<div class="hero-gradient-erp p-5 rounded-5 text-center text-white shadow-lg">
|
||||
<h2 class="display-5 fw-bold mb-4">Pronto para transformar sua gestão?</h2>
|
||||
<p class="lead mb-4">O ERP Syspanel é a ferramenta que faltava para sua empresa atingir o próximo nível.</p>
|
||||
<div class="d-flex gap-3 justify-content-center flex-wrap">
|
||||
<a href="{{ route('contato') }}" class="btn btn-warning btn-lg px-5 rounded-pill fw-bold shadow text-dark">
|
||||
<i class="bi bi-rocket me-2"></i>Falar com Especialista
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@endsection
|
||||
Executable
+24
@@ -0,0 +1,24 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Acesso Negado')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center align-items-center" style="min-height: 60vh;">
|
||||
<div class="col-md-6 text-center">
|
||||
<div class="mb-4">
|
||||
<i class="bi bi-lock text-danger"></i>
|
||||
</div>
|
||||
<h1 class="display-4 fw-bold text-danger mb-3">403</h1>
|
||||
<h2 class="h4 mb-3">Acesso Negado</h2>
|
||||
<p class="text-muted mb-4">
|
||||
Você não tem permissão para acessar esta seção do sistema.<br>
|
||||
Entre em contato com o administrador caso precise de acesso.
|
||||
</p>
|
||||
<a href="{{ route('home') }}" class="btn btn-primary btn-lg px-5">
|
||||
<i class="bi bi-house me-2"></i> Voltar ao Dashboard
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+57
@@ -0,0 +1,57 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="pt-BR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Site em Manutenção - {{ config('app.name') }}</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
||||
<style>
|
||||
body {
|
||||
background-color: #f8f9fa;
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.maintenance-card {
|
||||
max-width: 600px;
|
||||
padding: 3rem;
|
||||
border-radius: 1.5rem;
|
||||
box-shadow: 0 1rem 3rem rgba(0,0,0,0.1);
|
||||
background-color: white;
|
||||
text-align: center;
|
||||
}
|
||||
.maintenance-icon {
|
||||
font-size: 5rem;
|
||||
color: #0d6efd;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="maintenance-card mx-3">
|
||||
<div class="maintenance-icon">
|
||||
<i class="bi bi-tools"></i>
|
||||
</div>
|
||||
<h1 class="display-5 fw-bold mb-4">Site em Manutenção</h1>
|
||||
<p class="lead text-muted mb-5">
|
||||
Estamos realizando algumas melhorias em nosso site para oferecer uma experiência ainda melhor.
|
||||
Voltaremos em breve!
|
||||
</p>
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-center">
|
||||
<a href="mailto:contato@syspanel.com.br" class="btn btn-outline-primary rounded-pill px-4">
|
||||
<i class="bi bi-envelope me-2"></i> Entrar em Contato
|
||||
</a>
|
||||
@auth
|
||||
@if(Auth::user()->user_type === 'Admin')
|
||||
<a href="{{ route('home') }}" class="btn btn-primary rounded-pill px-4">
|
||||
<i class="bi bi-speedometer2 me-2"></i> Ir para o Painel
|
||||
</a>
|
||||
@endif
|
||||
@endauth
|
||||
</div>
|
||||
<p class="mt-5 text-muted small">© {{ date('Y') }} {{ config('app.name') }}. Todos os direitos reservados.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Executable
+52
@@ -0,0 +1,52 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title)
|
||||
@section('meta_description', $page ? $page->meta_description : 'Perguntas frequentes sobre a Syspanel.')
|
||||
@section('meta_keywords', $page->meta_keywords)
|
||||
@section('og_title', $page->og_title)
|
||||
@section('og_description', $page->og_description)
|
||||
@section('og_image', $page->og_image)
|
||||
@section('canonical', $page->canonical_url)
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-4 fw-bold text-primary">Perguntas Frequentes</h1>
|
||||
<p class="lead text-muted">Tire suas dúvidas rápidas sobre a Syspanel.</p>
|
||||
</div>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="accordion shadow-sm" id="accordionFaq">
|
||||
@forelse($faqs as $index => $faq)
|
||||
<div class="accordion-item border-0 mb-3 rounded-3 overflow-hidden shadow-sm">
|
||||
<h2 class="accordion-header" id="heading{{ $faq->id }}">
|
||||
<button class="accordion-button {{ $index === 0 ? '' : 'collapsed' }} fw-bold py-4" type="button" data-bs-toggle="collapse" data-bs-target="#collapse{{ $faq->id }}" aria-expanded="{{ $index === 0 ? 'true' : 'false' }}" aria-controls="collapse{{ $faq->id }}">
|
||||
<i class="bi bi-question-circle me-3 text-primary"></i>
|
||||
{{ $faq->question }}
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapse{{ $faq->id }}" class="accordion-collapse collapse {{ $index === 0 ? 'show' : '' }}" aria-labelledby="heading{{ $faq->id }}" data-bs-parent="#accordionFaq">
|
||||
<div class="accordion-body py-4 px-5 text-muted">
|
||||
{!! nl2br(e($faq->answer)) !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<div class="text-center py-5">
|
||||
<i class="bi bi-info-circle fs-1 text-muted mb-3 d-block"></i>
|
||||
<p class="text-muted">Nenhuma pergunta cadastrada no momento.</p>
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-5">
|
||||
<p class="text-muted">Ainda tem dúvidas?</p>
|
||||
<a href="{{ route('contato') }}" class="btn btn-primary px-5 py-3 rounded-pill fw-bold shadow-sm">
|
||||
Entre em Contato Conosco
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+230
@@ -0,0 +1,230 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title ?? 'Fluxo de Caixa Pro - Gestão Financeira Inteligente')
|
||||
@section('meta_description', $page->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.')
|
||||
@section('meta_keywords', $page->meta_keywords ?? 'fluxo de caixa, gestão financeira, dre gerencial, conciliação bancária, ia financeira, syspanel')
|
||||
|
||||
@section('content')
|
||||
<style>
|
||||
.hero-fluxo {
|
||||
background: linear-gradient(135deg, #134e5e 0%, #71b280 100%);
|
||||
padding: 100px 0;
|
||||
}
|
||||
.feature-box {
|
||||
background: #fff;
|
||||
padding: 30px;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,0.05);
|
||||
transition: all 0.3s ease;
|
||||
height: 100%;
|
||||
border: 1px solid rgba(0,0,0,0.02);
|
||||
}
|
||||
.feature-box:hover {
|
||||
transform: translateY(-10px);
|
||||
box-shadow: 0 15px 40px rgba(0,0,0,0.1);
|
||||
}
|
||||
.icon-circle {
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
background: rgba(25, 135, 84, 0.1);
|
||||
color: #198754;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 1.8rem;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.stat-card {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
backdrop-filter: blur(10px);
|
||||
border-radius: 15px;
|
||||
padding: 20px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
.step-number {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background: #198754;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: bold;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.gradient-text-finance {
|
||||
background: linear-gradient(135deg, #134e5e 0%, #198754 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
font-weight: 800;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<section class="hero-fluxo text-white position-relative overflow-hidden">
|
||||
<div class="container position-relative z-2">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-7">
|
||||
<span class="badge bg-white text-success px-3 py-2 rounded-pill fw-bold mb-3 shadow-sm">
|
||||
<i class="bi bi-shield-check me-2"></i>PRECISÃO FINANCEIRA ABSOLUTA
|
||||
</span>
|
||||
<h1 class="display-3 fw-bold mb-4">Fluxo de Caixa Pro: O Coração Financeiro do Seu Negócio</h1>
|
||||
<p class="lead mb-5 opacity-90">
|
||||
Muito mais que uma planilha. Uma plataforma inteligente que antecipa cenários, automatiza processos e garante que você nunca mais seja pego de surpresa pelo saldo da conta.
|
||||
</p>
|
||||
<div class="d-flex gap-3 flex-wrap">
|
||||
<a href="https://fluxodecaixapro.syspanel.com.br" target="_blank" class="btn btn-light btn-lg rounded-pill px-5 py-3 fw-bold text-success shadow-lg">
|
||||
<i class="bi bi-rocket me-2"></i>Acessar Agora
|
||||
</a>
|
||||
<a href="{{ route('contato') }}" class="btn btn-outline-light btn-lg rounded-pill px-5 py-3 fw-bold">
|
||||
<i class="bi bi-calendar-check me-2"></i>Agendar Demonstração
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-5 mt-5 mt-lg-0">
|
||||
<div class="stat-card floating-animation">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="icon-circle bg-white text-success mb-0 me-3 shadow-sm">
|
||||
<i class="bi bi-robot"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h5 class="mb-0 fw-bold">IA Financeira Ativa</h5>
|
||||
<small class="opacity-75">Analisando tendências em tempo real</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<small>Saúde do Caixa</small>
|
||||
<small class="fw-bold">98%</small>
|
||||
</div>
|
||||
<div class="progress bg-white bg-opacity-20" style="height: 6px;">
|
||||
<div class="progress-bar bg-white" style="width: 98%"></div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="small mb-0 opacity-80 italic">"A projeção para os próximos 30 dias indica crescimento de 15% na liquidez corrente."</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- O que é -->
|
||||
<section class="py-5 bg-white">
|
||||
<div class="container py-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-6 mb-5 mb-lg-0">
|
||||
<img src="https://img.freepik.com/free-vector/financial-dashboard-concept-illustration_114360-4491.jpg" alt="Fluxo de Caixa" class="img-fluid rounded-4 shadow-lg">
|
||||
</div>
|
||||
<div class="col-lg-6 ps-lg-5">
|
||||
<h2 class="display-5 fw-bold mb-4">O que é o Fluxo de Caixa e para que serve?</h2>
|
||||
<p class="text-muted fs-5 mb-4">
|
||||
O Fluxo de Caixa é o registro de todas as entradas e saídas de dinheiro da sua empresa. Ele serve como o termômetro da saúde financeira do seu negócio.
|
||||
</p>
|
||||
<div class="row g-4">
|
||||
<div class="col-md-6">
|
||||
<div class="d-flex align-items-start mb-3">
|
||||
<i class="bi bi-check-circle text-success me-3 mt-1 fs-4"></i>
|
||||
<div>
|
||||
<h5 class="fw-bold">Entradas</h5>
|
||||
<p class="small text-muted mb-0">Vendas, recebimentos e aportes.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="d-flex align-items-start mb-3">
|
||||
<i class="bi bi-check-circle text-danger me-3 mt-1 fs-4"></i>
|
||||
<div>
|
||||
<h5 class="fw-bold">Saídas</h5>
|
||||
<p class="small text-muted mb-0">Pagamentos, custos e despesas.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-muted mt-4">
|
||||
Sem esse controle, você navega no escuro. O <strong>Fluxo de Caixa Pro</strong> traz a luz necessária para você enxergar onde cada centavo está sendo aplicado.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Importância -->
|
||||
<section class="py-5 bg-light">
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h2 class="display-5 fw-bold">Por que o controle rigoroso é vital?</h2>
|
||||
<p class="text-muted fs-5">A diferença entre o sucesso e o fechamento de uma empresa está na gestão do caixa.</p>
|
||||
</div>
|
||||
<div class="row g-4">
|
||||
<div class="col-lg-4">
|
||||
<div class="feature-box">
|
||||
<div class="icon-circle"><i class="bi bi-eye"></i></div>
|
||||
<h4 class="fw-bold">Previsibilidade</h4>
|
||||
<p class="text-muted">Saiba exatamente quanto terá em caixa daqui a 15, 30 ou 90 dias com base em dados reais e IA.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="feature-box">
|
||||
<div class="icon-circle text-primary" style="background: rgba(13,110,253,0.1)"><i class="bi bi-cash"></i></div>
|
||||
<h4 class="fw-bold">Tomada de Decisão</h4>
|
||||
<p class="text-muted">Posso investir agora? Tenho fôlego para uma nova contratação? Decida baseado em números, não em intuição.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="feature-box">
|
||||
<div class="icon-circle text-warning" style="background: rgba(255,193,7,0.1)"><i class="bi bi-shield-check"></i></div>
|
||||
<h4 class="fw-bold">Segurança Financeira</h4>
|
||||
<p class="text-muted">Evite o pagamento de juros bancários e multas por atraso através de um cronograma de pagamentos eficiente.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Diferenciais Pro -->
|
||||
<section class="py-5 bg-dark text-white">
|
||||
<div class="container py-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-12">
|
||||
<h2 class="display-5 fw-bold mb-4">Acesso Global & Inteligência Artificial</h2>
|
||||
<p class="lead opacity-75 mb-4">O Fluxo de Caixa Pro foi construído com as tecnologias mais modernas do mercado.</p>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li class="mb-3 d-flex align-items-center"><i class="bi bi-cloud text-success me-3"></i> 100% em Nuvem: Acesse de onde estiver, pelo celular ou computador.</li>
|
||||
<li class="mb-3 d-flex align-items-center"><i class="bi bi-cpu text-success me-3"></i> IA Preditiva: Antecipação de inadimplência e sugestões de economia.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li class="mb-3 d-flex align-items-center"><i class="bi bi-arrow-repeat text-success me-3"></i> Conciliação Bancária</li>
|
||||
<li class="mb-3 d-flex align-items-center"><i class="bi bi-persons text-success me-3"></i> Sistema Multiusuário: Segurança e controle total de acessos para sua equipe.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center mt-5">
|
||||
<a href="https://fluxodecaixapro.syspanel.com.br" target="_blank" class="btn btn-success btn-lg rounded-pill px-5 fw-bold">Experimentar Agora</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CTA Final -->
|
||||
<section class="py-5 bg-white">
|
||||
<div class="container py-5 text-center">
|
||||
<h2 class="display-4 fw-bold mb-4">Assuma o controle total hoje mesmo!</h2>
|
||||
<p class="lead text-muted mb-5">Junte-se aos empresários que profissionalizaram sua gestão financeira com o Fluxo de Caixa Pro.</p>
|
||||
<div class="d-flex gap-3 justify-content-center">
|
||||
<a href="https://fluxodecaixapro.syspanel.com.br" target="_blank" class="btn btn-success btn-lg rounded-pill px-5 py-3 fw-bold shadow-lg">
|
||||
<i class="bi bi-rocket me-2"></i>Começar Agora
|
||||
</a>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<p class="text-muted"><i class="bi bi-link-45deg me-2"></i>Acesse: <a href="https://fluxodecaixapro.syspanel.com.br" target="_blank" class="text-success text-decoration-none fw-bold">fluxodecaixapro.syspanel.com.br</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endsection
|
||||
Executable
+63
@@ -0,0 +1,63 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $category->name . ' - Galerias')
|
||||
@section('meta_description', $category->description ?? 'Galerias na categoria ' . $category->name)
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-5 fw-bold text-primary">{{ $category->name }}</h1>
|
||||
@if($category->description)
|
||||
<p class="lead text-muted">{{ $category->description }}</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if($galleries->count() > 0)
|
||||
<div class="row g-4">
|
||||
@foreach($galleries as $gallery)
|
||||
<div class="col-sm-6 col-md-4 col-lg-3">
|
||||
<a href="{{ route('gallery.show', $gallery->slug) }}" class="text-decoration-none">
|
||||
<div class="card h-100 border-0 shadow-sm overflow-hidden gallery-card">
|
||||
@if($gallery->images->count() > 0)
|
||||
@php $firstImage = $gallery->images->first(); @endphp
|
||||
<img src="{{ asset('storage/' . $firstImage->file_path) }}" alt="{{ $gallery->title }}" style="height: 200px; object-fit: cover; transition: transform 0.3s;">
|
||||
@else
|
||||
<div class="bg-light d-flex align-items-center justify-content-center" style="height: 200px;">
|
||||
<i class="bi bi-images text-muted"></i>
|
||||
</div>
|
||||
@endif
|
||||
<div class="card-body text-center">
|
||||
<h6 class="card-title fw-bold text-dark mb-1">{{ $gallery->title }}</h6>
|
||||
<small class="text-muted">{{ $gallery->images_count }} fotos</small>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="mt-5 d-flex justify-content-center">
|
||||
{{ $galleries->links() }}
|
||||
</div>
|
||||
@else
|
||||
<div class="text-center py-5">
|
||||
<i class="bi bi-images text-muted mb-3 d-block"></i>
|
||||
<p class="text-muted fs-5">Nenhuma galeria nesta categoria no momento.</p>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="text-center mt-5">
|
||||
<a href="{{ route('index') }}" class="btn btn-outline-primary px-5 rounded-pill fw-bold">
|
||||
<i class="bi bi-arrow-left me-2"></i> Voltar ao Início
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('css')
|
||||
<style>
|
||||
.gallery-card:hover img {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
Executable
+136
@@ -0,0 +1,136 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $gallery->title . ' - Galeria')
|
||||
@section('meta_description', $gallery->description ?? 'Galeria de fotos.')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-4 fw-bold text-primary">{{ $gallery->title }}</h1>
|
||||
@if($gallery->description)
|
||||
<p class="lead text-muted">{{ $gallery->description }}</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="row g-4" id="gallery-container">
|
||||
@forelse($gallery->images as $index => $image)
|
||||
<div class="col-sm-6 col-md-4 col-lg-3">
|
||||
<div class="card h-100 border-0 shadow-sm overflow-hidden gallery-card" style="cursor: pointer;" onclick="openCarousel({{ $index }})">
|
||||
<img src="{{ asset('storage/' . $image->file_path) }}" class="card-img-top" alt="{{ $image->description }}" style="height: 200px; object-fit: cover; transition: transform 0.3s;">
|
||||
@if($image->description)
|
||||
<div class="card-body p-2 text-center bg-light">
|
||||
<small class="text-muted">{{ $image->description }}</small>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<div class="col-12 text-center py-5">
|
||||
<i class="bi bi-images fs-1 text-muted d-block mb-3"></i>
|
||||
<p class="text-muted">Esta galeria ainda não possui fotos.</p>
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-5">
|
||||
<a href="{{ route('index') }}" class="btn btn-outline-primary px-5 rounded-pill fw-bold">
|
||||
<i class="bi bi-arrow-left me-2"></i> Voltar ao Início
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Carousel Modal -->
|
||||
<div class="modal fade" id="galleryCarouselModal" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-xl modal-dialog-centered">
|
||||
<div class="modal-content bg-dark border-0">
|
||||
<div class="modal-header border-0 pb-0">
|
||||
<h5 class="modal-title text-white" id="carouselImageTitle"></h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Fechar"></button>
|
||||
</div>
|
||||
<div class="modal-body p-0">
|
||||
<div id="galleryCarousel" class="carousel slide" data-bs-ride="false">
|
||||
<div class="carousel-inner">
|
||||
@foreach($gallery->images as $index => $image)
|
||||
<div class="carousel-item {{ $index === 0 ? 'active' : '' }}" data-index="{{ $index }}" data-title="{{ $image->description ?? '' }}">
|
||||
<div class="d-flex align-items-center justify-content-center" style="min-height: 400px; max-height: 75vh;">
|
||||
<img src="{{ asset('storage/' . $image->file_path) }}" class="d-block img-fluid" alt="{{ $image->description }}" style="max-height: 75vh; object-fit: contain;">
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@if($gallery->images->count() > 1)
|
||||
<button class="carousel-control-prev" type="button" data-bs-target="#galleryCarousel" data-bs-slide="prev">
|
||||
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Anterior</span>
|
||||
</button>
|
||||
<button class="carousel-control-next" type="button" data-bs-target="#galleryCarousel" data-bs-slide="next">
|
||||
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Próxima</span>
|
||||
</button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer border-0 pt-0 justify-content-center">
|
||||
<span class="text-white-50" id="carouselCounter"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('css')
|
||||
<style>
|
||||
.gallery-card:hover img {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
#galleryCarouselModal .modal-body {
|
||||
padding: 0;
|
||||
}
|
||||
#galleryCarouselModal .carousel-item img {
|
||||
transition: none;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
const totalImages = {{ $gallery->images->count() }};
|
||||
let carouselInstance = null;
|
||||
|
||||
function openCarousel(index) {
|
||||
const modal = new bootstrap.Modal(document.getElementById('galleryCarouselModal'));
|
||||
const carouselEl = document.getElementById('galleryCarousel');
|
||||
|
||||
carouselInstance = new bootstrap.Carousel(carouselEl, {
|
||||
ride: false,
|
||||
wrap: true
|
||||
});
|
||||
|
||||
carouselInstance.to(index);
|
||||
updateCounter(index);
|
||||
modal.show();
|
||||
}
|
||||
|
||||
function updateCounter(index) {
|
||||
const counter = document.getElementById('carouselCounter');
|
||||
const title = document.getElementById('carouselImageTitle');
|
||||
const items = document.querySelectorAll('#galleryCarousel .carousel-item');
|
||||
|
||||
if (items[index]) {
|
||||
counter.textContent = (index + 1) + ' de ' + totalImages;
|
||||
title.textContent = items[index].dataset.title || '';
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('galleryCarousel')?.addEventListener('slid.bs.carousel', function(e) {
|
||||
updateCounter(e.to);
|
||||
});
|
||||
|
||||
document.getElementById('galleryCarouselModal')?.addEventListener('hidden.bs.modal', function() {
|
||||
if (carouselInstance) {
|
||||
carouselInstance.dispose();
|
||||
carouselInstance = null;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
Executable
+201
@@ -0,0 +1,201 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Dashboard')
|
||||
|
||||
@section('content')
|
||||
<!-- Page Heading -->
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Dashboard</h1>
|
||||
</div>
|
||||
|
||||
<!-- Estatísticas do Site -->
|
||||
<div class="row">
|
||||
<!-- Card Chamados -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-warning shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-warning text-uppercase mb-1">
|
||||
Chamados Pendentes</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">{{ $metrics['pending_tickets'] }}</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-chat-dots text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(isset($metrics['total_products']))
|
||||
<!-- Card Produtos (Products Module) -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-primary shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
|
||||
Total de Produtos</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">{{ $metrics['total_products'] }}</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-box text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(isset($metrics['total_services']))
|
||||
<!-- Card Serviços (Services Module) -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-success shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-success text-uppercase mb-1">
|
||||
Total de Serviços</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">{{ $metrics['total_services'] }}</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-bell text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(Auth::user()->isAdmin())
|
||||
<!-- Card Cadastros (Admin only) -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-secondary shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-secondary text-uppercase mb-1">
|
||||
Usuários Cadastrados</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">{{ $metrics['total_users'] }}</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-persons text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<!-- Segunda Linha de Cards (Mensagens) -->
|
||||
<div class="row">
|
||||
<!-- Card Contatos -->
|
||||
<div class="col-xl-3 col-md-6 mb-4">
|
||||
<div class="card border-left-info shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col me-2">
|
||||
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">
|
||||
Mensagens Recebidas</div>
|
||||
<div class="h5 mb-0 font-weight-bold text-gray-800">{{ $metrics['total_contacts'] }}</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-envelope text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Content Row -->
|
||||
<div class="row">
|
||||
<div class="col-lg-12 mb-4">
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">{{ session('success') }}</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
Bem-vindo, {{ Auth::user()->name }}!
|
||||
<span class="badge badge-{{ Auth::user()->isAdmin() ? 'danger' : 'primary' }} ml-2">{{ Auth::user()->user_type }}</span>
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>Você está logado no painel administrativo da <strong>{{ $company->name }}</strong>.</p>
|
||||
@if(Auth::user()->isAdmin())
|
||||
<p class="mb-0">Como <strong>Administrador</strong>, você tem acesso total ao sistema: gerenciar usuários, configurar permissões, serviços, produtos e todas as funcionalidades.</p>
|
||||
@else
|
||||
<p class="mb-0">Aqui você poderá gerenciar as seções do sistema que o administrador liberou para seu acesso. Utilize o menu lateral para navegar.</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card de Solicitação de Funcionalidades Premium -->
|
||||
<div class="card shadow mb-4 border-0 overflow-hidden">
|
||||
<div class="row no-gutters">
|
||||
<div class="col-lg-5 bg-gradient-primary p-5 d-flex flex-column justify-content-center text-white">
|
||||
<div class="mb-4">
|
||||
<span class="badge badge-warning text-dark px-3 py-2 mb-3 fw-bold text-uppercase shadow-sm">
|
||||
<i class="bi bi-rocket me-1"></i> Evolução Contínua
|
||||
</span>
|
||||
<h2 class="display-5 fw-bold mb-3">Seu site pode ir muito além!</h2>
|
||||
<p class="lead opacity-90">O <strong>SysSiteCMS</strong> foi projetado para crescer junto com o seu negócio. Se você sente que seu painel precisa de algo novo e exclusivo, nós podemos criar.</p>
|
||||
</div>
|
||||
|
||||
<ul class="list-unstyled mb-4">
|
||||
<li class="mb-3 d-flex align-items-center">
|
||||
<i class="bi bi-check-circle text-warning me-3"></i>
|
||||
<span>Soluções personalizadas para o seu fluxo</span>
|
||||
</li>
|
||||
<li class="mb-3 d-flex align-items-center">
|
||||
<i class="bi bi-check-circle text-warning me-3"></i>
|
||||
<span>Recursos sob medida para sua empresa</span>
|
||||
</li>
|
||||
<li class="mb-3 d-flex align-items-center">
|
||||
<i class="bi bi-check-circle text-warning me-3"></i>
|
||||
<span>Inovação e tecnologia de ponta</span>
|
||||
</li>
|
||||
<li class="d-flex align-items-center">
|
||||
<i class="bi bi-check-circle text-warning me-3"></i>
|
||||
<span>Sua ideia transformada em ferramenta</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="mt-auto pt-4 border-top border-light opacity-80">
|
||||
<div class="small text-uppercase fw-bold mb-2">Fale com nossos especialistas:</div>
|
||||
<a href="mailto:contato@syspanel.com.br" class="text-white text-decoration-none h5 mb-0">
|
||||
<i class="bi bi-envelope me-2"></i> contato@syspanel.com.br
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-7 bg-white p-5">
|
||||
<div class="p-2">
|
||||
<h3 class="font-weight-bold text-gray-900 mb-4">Qual é o próximo passo para o seu site?</h3>
|
||||
<p class="text-muted mb-4">Compartilhe sua visão conosco. Descreva o que facilitaria o seu dia a dia ou qual novo desafio seu site precisa enfrentar hoje.</p>
|
||||
|
||||
<form action="{{ route('home.feature.request') }}" method="POST">
|
||||
@csrf
|
||||
<div class="form-group mb-4">
|
||||
<label class="small font-weight-bold text-primary text-uppercase">Sua ideia / Sugestão</label>
|
||||
<textarea name="feature_description" class="form-control form-control-lg border-left-primary @error('feature_description') is-invalid @enderror"
|
||||
rows="5" placeholder="Conte-nos o que você está imaginando para o seu painel..." required></textarea>
|
||||
@error('feature_description') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block btn-lg py-3 fw-bold shadow hover-up">
|
||||
<i class="bi bi-lightbulb me-2"></i> Solicitar Consultoria de Inovação
|
||||
</button>
|
||||
</form>
|
||||
<p class="text-center mt-4 small text-muted">
|
||||
<i class="bi bi-shield-check me-1"></i> Sua solicitação será enviada com segurança para nossa equipe técnica.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+284
@@ -0,0 +1,284 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title)
|
||||
@section('meta_description', $page->meta_description)
|
||||
@section('meta_keywords', $page->meta_keywords)
|
||||
@section('og_title', $page->og_title)
|
||||
@section('og_description', $page->og_description)
|
||||
@section('og_image', $page->og_image)
|
||||
@section('canonical', $page->canonical_url)
|
||||
|
||||
@section('content')
|
||||
<style>
|
||||
.hero-gradient {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
}
|
||||
.hero-gradient-alt {
|
||||
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
|
||||
}
|
||||
.hero-gradient-tech {
|
||||
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
|
||||
}
|
||||
.card-gradient {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
}
|
||||
.floating-animation {
|
||||
animation: float 6s ease-in-out infinite;
|
||||
}
|
||||
@keyframes float {
|
||||
0%, 100% { transform: translateY(0px); }
|
||||
50% { transform: translateY(-20px); }
|
||||
}
|
||||
.pulse-animation {
|
||||
animation: pulse 2s ease-in-out infinite;
|
||||
}
|
||||
@keyframes pulse {
|
||||
0%, 100% { transform: scale(1); }
|
||||
50% { transform: scale(1.05); }
|
||||
}
|
||||
.service-card:hover {
|
||||
transform: translateY(-15px);
|
||||
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.feature-icon {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
}
|
||||
.stats-counter {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
</style>
|
||||
|
||||
<section class="hero-gradient min-vh-100 d-flex align-items-center position-relative overflow-hidden">
|
||||
<div class="container position-relative z-2">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-7 text-white">
|
||||
<div class="mb-4">
|
||||
<span class="badge bg-white bg-opacity-20 text-white px-4 py-2 rounded-pill fw-bold text-uppercase tracking-wider">
|
||||
<i class="bi bi-rocket me-2"></i>Inovação e Tecnologia
|
||||
</span>
|
||||
</div>
|
||||
<h1 class="display-3 fw-bold mb-4 leading-tight">
|
||||
Transforme Seu Negócio com <span class="text-warning">Sistemas Inteligentes</span>
|
||||
</h1>
|
||||
<p class="lead mb-5 opacity-90 fs-4">
|
||||
Desenvolvemos soluções personalizadas em ERP, Frameworks PHP, Hospedagem e CMS para impulsionar o crescimento da sua empresa.
|
||||
</p>
|
||||
<div class="d-flex gap-3 flex-wrap">
|
||||
@if(module_enabled('services'))
|
||||
<a href="{{ route('servicos') }}" class="btn btn-warning btn-lg rounded-pill px-5 py-3 fw-bold shadow-lg pulse-animation">
|
||||
<i class="bi bi-gears me-2"></i>Conheça Nossos Serviços
|
||||
</a>
|
||||
@endif
|
||||
<a href="{{ route('contato') }}" class="btn btn-outline-light btn-lg rounded-pill px-5 py-3 fw-bold">
|
||||
<i class="bi bi-send me-2"></i>Fale Conosco
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-5 text-center mt-5 mt-lg-0">
|
||||
<div class="floating-animation">
|
||||
<div class="bg-white bg-opacity-10 backdrop-blur-sm rounded-3xl p-5 shadow-2xl">
|
||||
<i class="bi bi-hdd-network text-white mb-4"></i>
|
||||
<h3 class="text-white fw-bold mb-3">Syspanel Suite</h3>
|
||||
<p class="text-white opacity-80">Soluções completas para gestão e desenvolvimento</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="position-absolute top-0 end-0 w-50 h-100 bg-white rounded-start-3xl" style="--bs-bg-opacity: .05; transform: skewX(-10deg);"></div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section class="py-5">
|
||||
<div class="container">
|
||||
<div class="text-center mb-5">
|
||||
<span class="badge bg-primary bg-opacity-10 text-primary px-4 py-2 rounded-pill fw-bold text-uppercase mb-3">
|
||||
<i class="bi bi-layers me-2"></i>Nossos Produtos
|
||||
</span>
|
||||
<h2 class="display-4 fw-bold mb-3">Soluções Completas para Seu Negócio</h2>
|
||||
<p class="lead text-muted mx-auto" style="max-width: 800px;">
|
||||
Oferecemos uma suite completa de produtos e serviços desenvolvidos com tecnologia de ponta para atender todas as necessidades da sua empresa.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="row g-4">
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<div class="card border-0 shadow-lg h-100 service-card transition-all duration-300">
|
||||
<div class="card-body p-5">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature-icon bg-gradient rounded-circle d-flex align-items-center justify-content-center text-white me-4 shadow">
|
||||
<i class="bi bi-graph-up"></i>
|
||||
</div>
|
||||
<h3 class="h4 fw-bold mb-0">SysERP</h3>
|
||||
</div>
|
||||
<p class="text-muted mb-4">
|
||||
Plataforma online completa para integrar e gerenciar todas as áreas da sua empresa: financeiro, vendas, estoque, produção e serviços.
|
||||
</p>
|
||||
<ul class="list-unstyled mb-4">
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Integração total de processos</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Controle em tempo real</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Personalização sob medida</li>
|
||||
</ul>
|
||||
<a href="https://erp.syspanel.com.br" target="_blank" class="btn btn-primary rounded-pill fw-bold w-100">
|
||||
<i class="bi bi-box-arrow-up-right me-2"></i>Acessar SysERP
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<div class="card border-0 shadow-lg h-100 service-card transition-all duration-300">
|
||||
<div class="card-body p-5">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature-icon bg-success bg-opacity-10 rounded-circle d-flex align-items-center justify-content-center text-success me-4 shadow">
|
||||
<i class="bi bi-cash-coin"></i>
|
||||
</div>
|
||||
<h3 class="h4 fw-bold mb-0">Fluxo de Caixa Pro</h3>
|
||||
</div>
|
||||
<p class="text-muted mb-4">
|
||||
Sistema especializado para controle rigoroso de fluxo de caixa, DRE gerencial, conciliação bancária e previsibilidade financeira total.
|
||||
</p>
|
||||
<ul class="list-unstyled mb-4">
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>DRE Gerencial Automático</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Conciliação Bancária OFX</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Gestão de Inadimplência</li>
|
||||
</ul>
|
||||
<a href="https://fluxodecaixapro.syspanel.com.br" target="_blank" class="btn btn-success rounded-pill fw-bold w-100">
|
||||
<i class="bi bi-box-arrow-up-right me-2"></i>Acessar Fluxo de Caixa Pro
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<div class="card border-0 shadow-lg h-100 service-card transition-all duration-300">
|
||||
<div class="card-body p-5">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature-icon hero-gradient-alt rounded-circle d-flex align-items-center justify-content-center text-white me-4 shadow">
|
||||
<i class="bi bi-newspaper"></i>
|
||||
</div>
|
||||
<h3 class="h4 fw-bold mb-0">SysCMS</h3>
|
||||
</div>
|
||||
<p class="text-muted mb-4">
|
||||
Sistema de gerenciamento de conteúdo potente com suporte multi-idioma, SEO avançado e controle de acesso granular.
|
||||
</p>
|
||||
<ul class="list-unstyled mb-4">
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Arquitetura modular expansível</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Suporte nativo a 5 idiomas</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Editor intuitivo e SEO otimizado</li>
|
||||
</ul>
|
||||
<a href="https://syscms.syspanel.com.br" target="_blank" class="btn btn-danger rounded-pill fw-bold w-100">
|
||||
<i class="bi bi-box-arrow-up-right me-2"></i>Acessar SysCMS
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<div class="card border-0 shadow-lg h-100 service-card transition-all duration-300">
|
||||
<div class="card-body p-5">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature-icon bg-success rounded-circle d-flex align-items-center justify-content-center text-white me-4 shadow">
|
||||
<i class="bi bi-cloud"></i>
|
||||
</div>
|
||||
<h3 class="h4 fw-bold mb-0">SysHost</h3>
|
||||
</div>
|
||||
<p class="text-muted mb-4">
|
||||
Hospedagem profissional com planos personalizados para sites, aplicativos, Laravel, WordPress e projetos SysMVC.
|
||||
</p>
|
||||
<ul class="list-unstyled mb-4">
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Infraestrutura de alto desempenho</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Suporte especializado 24/7</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Planos flexíveis e personalizados</li>
|
||||
</ul>
|
||||
<a href="https://host.syspanel.com.br" target="_blank" class="btn btn-success rounded-pill fw-bold w-100">
|
||||
<i class="bi bi-box-arrow-up-right me-2"></i>Acessar SysHost
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<div class="card border-0 shadow-lg h-100 service-card transition-all duration-300">
|
||||
<div class="card-body p-5">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature-icon bg-warning rounded-circle d-flex align-items-center justify-content-center text-white me-4 shadow">
|
||||
<i class="bi bi-rocket"></i>
|
||||
</div>
|
||||
<h3 class="h4 fw-bold mb-0">SysVector</h3>
|
||||
</div>
|
||||
<p class="text-muted mb-4">
|
||||
Framework PHP moderno com Bootstrap 5.3, Alpine.js e templates Twig para desenvolvimento web rápido e eficiente.
|
||||
</p>
|
||||
<ul class="list-unstyled mb-4">
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Bootstrap 5.3 completo</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Componentes Alpine.js</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Exemplos CRUD Twig</li>
|
||||
</ul>
|
||||
<a href="https://sysvector.syspanel.com.br" target="_blank" class="btn btn-warning rounded-pill fw-bold w-100">
|
||||
<i class="bi bi-box-arrow-up-right me-2"></i>Acessar SysVector
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<div class="card border-0 shadow-lg h-100 service-card transition-all duration-300">
|
||||
<div class="card-body p-5">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature-icon bg-dark rounded-circle d-flex align-items-center justify-content-center text-white me-4 shadow">
|
||||
<i class="bi bi-diagram-2"></i>
|
||||
</div>
|
||||
<h3 class="h4 fw-bold mb-0">SysMVC</h3>
|
||||
</div>
|
||||
<p class="text-muted mb-4">
|
||||
Framework PHP poderoso e flexível para desenvolvimento de aplicações web com arquitetura MVC profissional.
|
||||
</p>
|
||||
<ul class="list-unstyled mb-4">
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Arquitetura MVC robusta</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Flexibilidade total</li>
|
||||
<li class="mb-2"><i class="bi bi-check-lg text-success me-2"></i>Ideal para projetos complexos</li>
|
||||
</ul>
|
||||
<a href="https://sysmvc.syspanel.com.br" target="_blank" class="btn btn-dark rounded-pill fw-bold w-100">
|
||||
<i class="bi bi-box-arrow-up-right me-2"></i>Acessar SysMVC
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="py-5 hero-gradient">
|
||||
<div class="container">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-6 text-white mb-5 mb-lg-0">
|
||||
<h2 class="display-4 fw-bold mb-4">Pronto para Transformar Seu Negócio?</h2>
|
||||
<p class="lead mb-4 opacity-90">
|
||||
Entre em contato conosco e descubra como nossas soluções podem impulsionar o crescimento da sua empresa. Nossa equipe está pronta para atendê-lo.
|
||||
</p>
|
||||
<div class="d-flex gap-3 flex-wrap">
|
||||
<a href="{{ route('contato') }}" class="btn btn-light btn-lg rounded-pill px-5 py-3 fw-bold text-primary">
|
||||
<i class="bi bi-envelope me-2"></i>Solicitar Orçamento
|
||||
</a>
|
||||
<a href="https://wa.me/{{ preg_replace('/\D/', '', $company->phone) }}" target="_blank" class="btn btn-outline-light btn-lg rounded-pill px-5 py-3 fw-bold">
|
||||
<i class="bi bi-whatsapp me-2"></i>WhatsApp
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6 text-center">
|
||||
<div class="bg-white bg-opacity-10 backdrop-blur-sm rounded-3xl p-5">
|
||||
<i class="bi bi-handshake text-white mb-4"></i>
|
||||
<h3 class="text-white fw-bold mb-3">Parceria de Sucesso</h3>
|
||||
<p class="text-white opacity-80">Juntos vamos construir o futuro do seu negócio</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endsection
|
||||
Executable
+617
@@ -0,0 +1,617 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="pt-BR">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<title>SysSiteCMS - Admin - @yield('title', 'Dashboard')</title>
|
||||
|
||||
<!-- Custom fonts for this template-->
|
||||
<link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">
|
||||
|
||||
<!-- Custom styles for this template-->
|
||||
<link href="https://cdn.jsdelivr.net/npm/startbootstrap-sb-admin-2@4.1.4/css/sb-admin-2.min.css" rel="stylesheet">
|
||||
|
||||
<style>
|
||||
/* Estilos Polidos para o Modo Escuro (Dark Mode) */
|
||||
body.dark-mode {
|
||||
background-color: #1a1c23 !important;
|
||||
color: #ced4da;
|
||||
}
|
||||
body.dark-mode #content-wrapper,
|
||||
body.dark-mode .sticky-footer {
|
||||
background-color: #1a1c23 !important;
|
||||
}
|
||||
body.dark-mode .card {
|
||||
background-color: #24262d;
|
||||
border-color: #3a3b45;
|
||||
color: #ced4da;
|
||||
}
|
||||
body.dark-mode .card-header {
|
||||
background-color: #2d2f39;
|
||||
border-bottom-color: #3a3b45;
|
||||
color: #f8f9fc;
|
||||
}
|
||||
body.dark-mode .text-gray-800,
|
||||
body.dark-mode .h3,
|
||||
body.dark-mode .h4,
|
||||
body.dark-mode .h5,
|
||||
body.dark-mode .h6 {
|
||||
color: #f8f9fc !important;
|
||||
}
|
||||
body.dark-mode .text-gray-600 {
|
||||
color: #aab2ba !important;
|
||||
}
|
||||
body.dark-mode .bg-white {
|
||||
background-color: #24262d !important;
|
||||
}
|
||||
body.dark-mode .navbar {
|
||||
background-color: #24262d !important;
|
||||
border-bottom: 1px solid #3a3b45;
|
||||
}
|
||||
body.dark-mode .table {
|
||||
color: #ced4da;
|
||||
}
|
||||
body.dark-mode .table-bordered,
|
||||
body.dark-mode .table-bordered td,
|
||||
body.dark-mode .table-bordered th {
|
||||
border-color: #3a3b45;
|
||||
}
|
||||
body.dark-mode .table-hover tbody tr:hover {
|
||||
color: #ced4da;
|
||||
background-color: #2d2f39;
|
||||
}
|
||||
body.dark-mode .modal-content {
|
||||
background-color: #24262d;
|
||||
color: #ced4da;
|
||||
border-color: #3a3b45;
|
||||
}
|
||||
body.dark-mode .form-control {
|
||||
background-color: #1a1c23;
|
||||
border-color: #3a3b45;
|
||||
color: #ced4da;
|
||||
}
|
||||
body.dark-mode .form-control:focus {
|
||||
background-color: #1a1c23;
|
||||
border-color: #4e73df;
|
||||
color: #fff;
|
||||
}
|
||||
body.dark-mode .dropdown-menu {
|
||||
background-color: #24262d;
|
||||
border-color: #3a3b45;
|
||||
}
|
||||
body.dark-mode .dropdown-item {
|
||||
color: #ced4da;
|
||||
}
|
||||
body.dark-mode .dropdown-item:hover {
|
||||
background-color: #2d2f39;
|
||||
color: #fff;
|
||||
}
|
||||
body.dark-mode .dropdown-divider {
|
||||
border-top-color: #3a3b45;
|
||||
}
|
||||
body.dark-mode .sidebar-dark .sidebar-heading {
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
}
|
||||
body.dark-mode .bg-light {
|
||||
background-color: #2d2f39 !important;
|
||||
}
|
||||
body.dark-mode .border {
|
||||
border-color: #3a3b45 !important;
|
||||
}
|
||||
body.dark-mode hr {
|
||||
border-top-color: #3a3b45;
|
||||
}
|
||||
/* Ajuste para botões outline no dark mode */
|
||||
body.dark-mode .btn-light {
|
||||
background-color: #2d2f39;
|
||||
border-color: #3a3b45;
|
||||
color: #ced4da;
|
||||
}
|
||||
body.dark-mode .btn-light:hover {
|
||||
background-color: #3a3b45;
|
||||
color: #fff;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Bootstrap Icons (MIT License) -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
||||
|
||||
<style>
|
||||
/* SB Admin 2 overrides - replace Font Awesome arrows with CSS triangles */
|
||||
.sidebar .nav-item .nav-link[data-toggle="collapse"]::after {
|
||||
content: '' !important;
|
||||
font-family: none !important;
|
||||
display: inline-block !important;
|
||||
width: 0 !important;
|
||||
height: 0 !important;
|
||||
border-style: solid !important;
|
||||
border-width: 5px 5px 0 5px !important;
|
||||
border-color: rgba(255,255,255,0.6) transparent transparent transparent !important;
|
||||
float: right !important;
|
||||
transition: transform 0.2s ease-in-out !important;
|
||||
margin-top: 0.5rem !important;
|
||||
font-size: 0 !important;
|
||||
line-height: 0 !important;
|
||||
}
|
||||
.sidebar .nav-item .nav-link[data-toggle="collapse"][aria-expanded="true"]::after {
|
||||
transform: rotate(180deg) !important;
|
||||
}
|
||||
.sidebar .nav-item .collapse-inner::before,
|
||||
.sidebar .nav-item .collapse-inner::after {
|
||||
display: none !important;
|
||||
content: none !important;
|
||||
}
|
||||
/* Sidebar toggle button */
|
||||
#sidebarToggle::after {
|
||||
content: '' !important;
|
||||
font-family: none !important;
|
||||
display: none !important;
|
||||
}
|
||||
#sidebarToggle::before {
|
||||
content: '' !important;
|
||||
display: inline-block !important;
|
||||
width: 0 !important;
|
||||
height: 0 !important;
|
||||
border-style: solid !important;
|
||||
border-width: 8px 10px 8px 0 !important;
|
||||
border-color: transparent rgba(255,255,255,0.5) transparent transparent !important;
|
||||
}
|
||||
body.sidebar-toggled #sidebarToggle::before {
|
||||
border-width: 8px 0 8px 10px !important;
|
||||
border-color: transparent transparent transparent rgba(255,255,255,0.5) !important;
|
||||
}
|
||||
/* Remove any remaining FA pseudo-elements from SB Admin 2 */
|
||||
.sidebar .nav-item .nav-link::before {
|
||||
content: none !important;
|
||||
}
|
||||
.scroll-to-top i::before {
|
||||
content: '' !important;
|
||||
display: inline-block !important;
|
||||
width: 0 !important;
|
||||
height: 0 !important;
|
||||
border-style: solid !important;
|
||||
border-width: 0 6px 10px 6px !important;
|
||||
border-color: transparent transparent #fff transparent !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@stack('css')
|
||||
</head>
|
||||
|
||||
<body id="page-top" class="{{ (Auth::user()->preferences['theme'] ?? 'light') == 'dark' ? 'dark-mode' : '' }}">
|
||||
|
||||
<!-- Page Wrapper -->
|
||||
<div id="wrapper">
|
||||
|
||||
<!-- Sidebar -->
|
||||
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar">
|
||||
|
||||
<!-- Sidebar - Brand -->
|
||||
<a class="sidebar-brand d-flex align-items-center justify-content-center" href="{{ route('home') }}">
|
||||
<div class="sidebar-brand-icon rotate-n-15">
|
||||
<i class="bi bi-cpu"></i>
|
||||
</div>
|
||||
<div class="sidebar-brand-text mx-3">SysSiteCMS Admin</div>
|
||||
</a>
|
||||
|
||||
<!-- Divider -->
|
||||
<hr class="sidebar-divider my-0">
|
||||
|
||||
<!-- Nav Item - Dashboard -->
|
||||
<li class="nav-item {{ request()->routeIs('home') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('home') }}">
|
||||
<i class="bi bi-speedometer2"></i>
|
||||
<span>Dashboard</span></a>
|
||||
</li>
|
||||
|
||||
<!-- Divider -->
|
||||
<hr class="sidebar-divider">
|
||||
|
||||
@php
|
||||
$currentUser = Auth::user();
|
||||
$isAdmin = $currentUser->isAdmin();
|
||||
@endphp
|
||||
|
||||
<!-- Heading -->
|
||||
<div class="sidebar-heading">
|
||||
Gerenciamento
|
||||
</div>
|
||||
|
||||
@if($isAdmin)
|
||||
<!-- Nav Item - Usuários (Admin only) -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.users.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.users.index') }}">
|
||||
<i class="bi bi-people"></i>
|
||||
<span>Administração de Usuários</span></a>
|
||||
</li>
|
||||
<!-- Nav Item - Tipos de Usuário (Admin only) -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.user-types.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.user-types.index') }}">
|
||||
<i class="bi bi-person-badge"></i>
|
||||
<span>Tipos de Usuário</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('contacts'))
|
||||
<!-- Nav Item - Contatos -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.contacts.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.contacts.index') }}">
|
||||
<i class="bi bi-envelope"></i>
|
||||
<span>Contatos</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('subjects'))
|
||||
<!-- Nav Item - Assuntos -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.subjects.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.subjects.index') }}">
|
||||
<i class="bi bi-list"></i>
|
||||
<span>Assuntos</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(module_enabled('services') && ($isAdmin || $currentUser->hasPermission('services')))
|
||||
<!-- Nav Item - Serviços (Services Module) -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.services.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.services.index') }}">
|
||||
<i class="bi bi-bell"></i>
|
||||
<span>Gerenciar Serviços</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('faqs'))
|
||||
<!-- Nav Item - FAQ -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.faqs.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.faqs.index') }}">
|
||||
<i class="bi bi-question-circle"></i>
|
||||
<span>Gerenciar FAQ</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('news'))
|
||||
<!-- Nav Item - Notícias -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.news.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.news.index') }}">
|
||||
<i class="bi bi-newspaper"></i>
|
||||
<span>Gerenciar Notícias</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('downloads'))
|
||||
<!-- Nav Item - Downloads -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.downloads.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.downloads.index') }}">
|
||||
<i class="bi bi-download"></i>
|
||||
<span>Gerenciar Downloads</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(module_enabled('products') && ($isAdmin || $currentUser->hasPermission('products')))
|
||||
<!-- Nav Item - Produtos (Products Module) -->
|
||||
<li class="nav-item {{ request()->is('admin/produtos*') ? 'active' : '' }}">
|
||||
<a class="nav-link {{ request()->is('admin/produtos*') ? '' : 'collapsed' }}" href="#" data-toggle="collapse" data-target="#collapseProducts"
|
||||
aria-expanded="{{ request()->is('admin/produtos*') ? 'true' : 'false' }}" aria-controls="collapseProducts">
|
||||
<i class="bi bi-box-seam"></i>
|
||||
<span>Gerenciar Produtos</span>
|
||||
</a>
|
||||
<div id="collapseProducts" class="collapse {{ request()->is('admin/produtos*') ? 'show' : '' }}" aria-labelledby="headingProducts" data-parent="#accordionSidebar">
|
||||
<div class="bg-white py-2 collapse-inner rounded">
|
||||
<h6 class="collapse-header">Opções:</h6>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.products.index') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.products.index') }}">Lista de Produtos</a>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.categories.index') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.categories.index') }}">Categorias</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('galleries'))
|
||||
<!-- Nav Item - Galerias -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.galleries.*') || request()->routeIs('admin.gallery-categories.*') ? 'active' : '' }}">
|
||||
<a class="nav-link {{ request()->routeIs('admin.galleries.*') || request()->routeIs('admin.gallery-categories.*') ? '' : 'collapsed' }}" href="#" data-toggle="collapse" data-target="#collapseGalleries"
|
||||
aria-expanded="{{ request()->routeIs('admin.galleries.*') || request()->routeIs('admin.gallery-categories.*') ? 'true' : 'false' }}" aria-controls="collapseGalleries">
|
||||
<i class="bi bi-images"></i>
|
||||
<span>Galerias</span>
|
||||
</a>
|
||||
<div id="collapseGalleries" class="collapse {{ request()->routeIs('admin.galleries.*') || request()->routeIs('admin.gallery-categories.*') ? 'show' : '' }}" aria-labelledby="headingGalleries" data-parent="#accordionSidebar">
|
||||
<div class="bg-white py-2 collapse-inner rounded">
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.galleries.*') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.galleries.index') }}">Galerias de Fotos</a>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.gallery-categories.*') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.gallery-categories.index') }}">Categorias</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('pages'))
|
||||
<!-- Nav Item - Páginas -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.pages.*') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.pages.index') }}">
|
||||
<i class="bi bi-file-text"></i>
|
||||
<span>Gerenciar Páginas</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('marketing'))
|
||||
<!-- Nav Item - Marketing -->
|
||||
<li class="nav-item {{ request()->is('admin/marketing*') ? 'active' : '' }}">
|
||||
<a class="nav-link {{ request()->is('admin/marketing*') ? '' : 'collapsed' }}" href="#" data-toggle="collapse" data-target="#collapseMarketing"
|
||||
aria-expanded="{{ request()->is('admin/marketing*') ? 'true' : 'false' }}" aria-controls="collapseMarketing">
|
||||
<i class="bi bi-megaphone text-warning"></i>
|
||||
<span class="text-warning font-weight-bold">Marketing</span>
|
||||
</a>
|
||||
<div id="collapseMarketing" class="collapse {{ request()->is('admin/marketing*') ? 'show' : '' }}" aria-labelledby="headingMarketing" data-parent="#accordionSidebar">
|
||||
<div class="bg-white py-2 collapse-inner rounded">
|
||||
<h6 class="collapse-header">Ferramentas:</h6>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.marketing.index') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.marketing.index') }}">Dashboard</a>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.marketing.banners.*') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.marketing.banners.index') }}">Gerenciar Banners</a>
|
||||
@if(module_enabled('products'))
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.marketing.promote.products') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.marketing.promote.products') }}">Promover Produtos</a>
|
||||
@endif
|
||||
@if(module_enabled('services'))
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.marketing.promote.services') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.marketing.promote.services') }}">Promover Serviços</a>
|
||||
@endif
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.marketing.email') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.marketing.email') }}">E-mail Marketing</a>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.marketing.analytics') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.marketing.analytics') }}">Análise de Visitantes</a>
|
||||
<hr class="my-1">
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1" href="https://syscrm.syspanel.com.br" target="_blank">
|
||||
<i class="bi bi-people text-primary me-1"></i> SysCRM
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(module_enabled('chatbot') && ($isAdmin || $currentUser->hasPermission('chatbot')))
|
||||
<!-- Nav Item - Chatbot (Chatbot Module) -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.chatbot.*') ? 'active' : '' }}">
|
||||
<a class="nav-link {{ request()->routeIs('admin.chatbot.*') ? '' : 'collapsed' }}" href="#" data-toggle="collapse" data-target="#collapseChatbot"
|
||||
aria-expanded="{{ request()->routeIs('admin.chatbot.*') ? 'true' : 'false' }}" aria-controls="collapseChatbot">
|
||||
<i class="bi bi-robot"></i>
|
||||
<span>Chatbot</span>
|
||||
</a>
|
||||
<div id="collapseChatbot" class="collapse {{ request()->routeIs('admin.chatbot.*') ? 'show' : '' }}" aria-labelledby="headingChatbot" data-parent="#accordionSidebar">
|
||||
<div class="bg-white py-2 collapse-inner rounded">
|
||||
<h6 class="collapse-header">Opções:</h6>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.chatbot.conversations') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.chatbot.conversations') }}">Conversas</a>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.chatbot.index') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.chatbot.index') }}">Base de Conhecimento</a>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.chatbot.rules.*') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.chatbot.rules.index') }}">
|
||||
<i class="bi bi-shield-lock"></i> Regras da IA
|
||||
</a>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('admin.chatbot.settings') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('admin.chatbot.settings') }}">Configurações</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($isAdmin || $currentUser->hasPermission('settings'))
|
||||
<!-- Nav Item - Dados da Empresa -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.settings.index') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.settings.index') }}">
|
||||
<i class="bi bi-building"></i>
|
||||
<span>Dados da Empresa</span></a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
<!-- Divider -->
|
||||
<hr class="sidebar-divider">
|
||||
|
||||
<!-- Heading -->
|
||||
<div class="sidebar-heading">
|
||||
Oportunidade
|
||||
</div>
|
||||
|
||||
<!-- Nav Item - ERP Syspanel -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.erp.ad') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.erp.ad') }}">
|
||||
<i class="bi bi-rocket text-warning"></i>
|
||||
<span class="font-weight-bold text-warning">ERP Syspanel</span>
|
||||
<span class="badge badge-danger ml-1">TOP</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<!-- Divider -->
|
||||
<hr class="sidebar-divider">
|
||||
|
||||
<!-- Heading -->
|
||||
<div class="sidebar-heading">
|
||||
Interface
|
||||
</div>
|
||||
|
||||
<!-- Nav Item - Pages Collapse Menu -->
|
||||
<li class="nav-item {{ request()->routeIs('profile.*') ? 'active' : '' }}">
|
||||
<a class="nav-link {{ request()->routeIs('profile.*') ? '' : 'collapsed' }}" href="#" data-toggle="collapse" data-target="#collapseTwo"
|
||||
aria-expanded="{{ request()->routeIs('profile.*') ? 'true' : 'false' }}" aria-controls="collapseTwo">
|
||||
<i class="bi bi-gear"></i>
|
||||
<span>Configurações</span>
|
||||
</a>
|
||||
<div id="collapseTwo" class="collapse {{ request()->routeIs('profile.*') ? 'show' : '' }}" aria-labelledby="headingTwo" data-parent="#accordionSidebar">
|
||||
<div class="bg-white py-2 collapse-inner rounded">
|
||||
<h6 class="collapse-header">Opções:</h6>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('profile.edit') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('profile.edit') }}">Perfil</a>
|
||||
<a class="collapse-inner-item px-3 text-dark text-decoration-none d-block py-1 {{ request()->routeIs('profile.preferences') ? 'font-weight-bold text-primary' : '' }}" href="{{ route('profile.preferences') }}">Preferências</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<!-- Nav Item - Manual de Uso -->
|
||||
<li class="nav-item {{ request()->routeIs('admin.manual') ? 'active' : '' }}">
|
||||
<a class="nav-link" href="{{ route('admin.manual') }}">
|
||||
<i class="bi bi-book"></i>
|
||||
<span>Manual de Uso</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<!-- Divider -->
|
||||
<hr class="sidebar-divider d-none d-md-block">
|
||||
|
||||
<!-- Sidebar Toggler (Sidebar) -->
|
||||
<div class="text-center d-none d-md-inline">
|
||||
<button class="rounded-circle border-0" id="sidebarToggle"></button>
|
||||
</div>
|
||||
|
||||
</ul>
|
||||
<!-- End of Sidebar -->
|
||||
|
||||
<!-- Content Wrapper -->
|
||||
<div id="content-wrapper" class="d-flex flex-column">
|
||||
|
||||
<!-- Main Content -->
|
||||
<div id="content">
|
||||
|
||||
<!-- Topbar -->
|
||||
<nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow">
|
||||
|
||||
<!-- Sidebar Toggle (Topbar) -->
|
||||
<button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle me-3">
|
||||
<i class="fa fa-bars"></i>
|
||||
</button>
|
||||
|
||||
<!-- Topbar Navbar -->
|
||||
<ul class="navbar-nav ml-auto">
|
||||
|
||||
<!-- Nav Item - Alerts -->
|
||||
<li class="nav-item dropdown no-arrow mx-1">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="alertsDropdown" role="button"
|
||||
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="bi bi-bell"></i>
|
||||
<!-- Counter - Alerts -->
|
||||
@if(Auth::user()->unreadNotifications->count() > 0)
|
||||
<span class="badge badge-danger badge-counter">{{ Auth::user()->unreadNotifications->count() }}</span>
|
||||
@endif
|
||||
</a>
|
||||
<!-- Dropdown - Alerts -->
|
||||
<div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in"
|
||||
aria-labelledby="alertsDropdown">
|
||||
<h6 class="dropdown-header">
|
||||
Centro de Notificações
|
||||
</h6>
|
||||
@forelse(Auth::user()->unreadNotifications as $notification)
|
||||
<a class="dropdown-item d-flex align-items-center" href="{{ route('admin.notifications.read', $notification->id) }}">
|
||||
<div class="mr-3">
|
||||
<div class="icon-circle bg-primary">
|
||||
<i class="bi bi-envelope text-white"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="small text-gray-500">{{ $notification->created_at->format('d/m/Y H:i') }}</div>
|
||||
<span class="font-weight-bold">{{ $notification->data['message'] }}</span>
|
||||
<div class="small text-muted">{{ $notification->data['name'] }} ({{ $notification->data['email'] }})</div>
|
||||
</div>
|
||||
</a>
|
||||
@empty
|
||||
<a class="dropdown-item text-center small text-gray-500" href="#">Nenhuma notificação nova</a>
|
||||
@endforelse
|
||||
|
||||
@if(Auth::user()->notifications->count() > 0)
|
||||
<a class="dropdown-item text-center small text-gray-500" href="{{ route('admin.notifications.clear') }}">Marcar todas como lidas</a>
|
||||
@endif
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<div class="topbar-divider d-none d-sm-block"></div>
|
||||
|
||||
<!-- Nav Item - User Information -->
|
||||
<li class="nav-item dropdown no-arrow">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button"
|
||||
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<span class="mr-2 d-none d-lg-inline text-gray-600 small">{{ Auth::user()->name }}</span>
|
||||
@if(Auth::user()->avatar)
|
||||
<img class="img-profile rounded-circle" src="{{ asset('storage/' . Auth::user()->avatar) }}">
|
||||
@else
|
||||
<img class="img-profile rounded-circle" src="https://ui-avatars.com/api/?name={{ urlencode(Auth::user()->name) }}&background=4e73df&color=fff">
|
||||
@endif
|
||||
</a>
|
||||
<!-- Dropdown - User Information -->
|
||||
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
|
||||
aria-labelledby="userDropdown">
|
||||
<a class="dropdown-item" href="{{ route('profile.edit') }}">
|
||||
<i class="bi bi-person me-2 text-gray-400"></i>
|
||||
Meu Perfil
|
||||
</a>
|
||||
<a class="dropdown-item" href="{{ route('profile.preferences') }}">
|
||||
<i class="bi bi-gears me-2 text-gray-400"></i>
|
||||
Preferências
|
||||
</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item" href="{{ route('index') }}">
|
||||
<i class="bi bi-box-arrow-up-right me-2 text-gray-400"></i>
|
||||
Ver Site
|
||||
</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item text-danger" href="{{ route('logout') }}"
|
||||
onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
|
||||
<i class="bi bi-box-arrow-right me-2 text-gray-400"></i>
|
||||
Sair
|
||||
</a>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</nav>
|
||||
<!-- End of Topbar -->
|
||||
|
||||
<!-- Begin Page Content -->
|
||||
<div class="container-fluid">
|
||||
@yield('content')
|
||||
</div>
|
||||
<!-- /.container-fluid -->
|
||||
|
||||
</div>
|
||||
<!-- End of Main Content -->
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="sticky-footer bg-white">
|
||||
<div class="container my-auto">
|
||||
<div class="copyright text-center my-auto">
|
||||
<span>Copyright © {{ $company->name ?? 'Syspanel' }} {{ date('Y') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- End of Footer -->
|
||||
|
||||
</div>
|
||||
<!-- End of Content Wrapper -->
|
||||
|
||||
</div>
|
||||
<!-- End of Page Wrapper -->
|
||||
|
||||
<!-- Scroll to Top Button-->
|
||||
<a class="scroll-to-top rounded" href="#page-top">
|
||||
<i class="bi bi-chevron-up"></i>
|
||||
</a>
|
||||
|
||||
<!-- Bootstrap core JavaScript-->
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
<!-- Core plugin JavaScript-->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"></script>
|
||||
|
||||
<!-- Custom scripts for all pages-->
|
||||
<script src="https://cdn.jsdelivr.net/npm/startbootstrap-sb-admin-2@4.1.4/js/sb-admin-2.min.js"></script>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Password Toggle
|
||||
$(document).on('click', '.toggle-password', function() {
|
||||
const input = $(this).closest('.input-group').find('input');
|
||||
const icon = $(this).find('i');
|
||||
if (input.attr('type') === 'password') {
|
||||
input.attr('type', 'text');
|
||||
icon.removeClass('fa-eye bi-eye').addClass('fa-eye-slash bi-eye-slash');
|
||||
} else {
|
||||
input.attr('type', 'password');
|
||||
icon.removeClass('fa-eye-slash bi-eye-slash').addClass('fa-eye bi-eye');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@stack('js')
|
||||
|
||||
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
|
||||
@csrf
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
Executable
+630
@@ -0,0 +1,630 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="pt-BR">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<!-- SEO Dinâmico -->
|
||||
<title>@yield('title', $company->name){{ \App\Models\Setting::get('seo_title_suffix', ' - SysSiteCMS') }}</title>
|
||||
<meta name="description" content="@yield('meta_description', \App\Models\Setting::get('seo_description_default', 'Especialistas em manutenção de computadores e notebooks.'))">
|
||||
@hasSection('meta_keywords')<meta name="keywords" content="@yield('meta_keywords')">@endif
|
||||
<link rel="canonical" href="@yield('canonical', request()->url())">
|
||||
|
||||
<!-- Open Graph / Facebook -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="{{ request()->url() }}">
|
||||
<meta property="og:title" content="@yield('og_title', View::getSection('title'))">
|
||||
<meta property="og:description" content="@yield('og_description', View::getSection('meta_description'))">
|
||||
<meta property="og:image" content="@yield('og_image', \App\Models\Setting::get('seo_og_image_default'))">
|
||||
|
||||
<!-- Scripts do Head (Analytics, etc) -->
|
||||
{!! \App\Models\Setting::get('scripts_head_custom') !!}
|
||||
@if($gaId = \App\Models\Setting::get('scripts_google_analytics'))
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id={{ $gaId }}"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', '{{ $gaId }}');
|
||||
</script>
|
||||
@endif
|
||||
|
||||
<!-- Fonts -->
|
||||
|
||||
<!-- Bootstrap 5.3 CSS (CDN para carregamento rápido no framework) -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
|
||||
<!-- Bootstrap Icons -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
||||
|
||||
|
||||
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--primary-color: #0d6efd;
|
||||
--secondary-color: #6c757d;
|
||||
--dark-color: #212529;
|
||||
--light-color: #f8f9fa;
|
||||
--accent-color: #ffc107;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Inter', 'Segoe UI', Roboto, sans-serif;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 100vh;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
main {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* Navbar Enhancements */
|
||||
.navbar {
|
||||
transition: all 0.3s ease;
|
||||
padding: 15px 0;
|
||||
}
|
||||
|
||||
.navbar.scrolled {
|
||||
padding: 10px 0;
|
||||
background: rgba(255, 255, 255, 0.95) !important;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
font-weight: 500;
|
||||
color: #444 !important;
|
||||
transition: color 0.3s ease;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.nav-link:hover, .nav-link.active {
|
||||
color: var(--primary-color) !important;
|
||||
}
|
||||
|
||||
.nav-link.active::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 1rem;
|
||||
right: 1rem;
|
||||
height: 2px;
|
||||
background: var(--primary-color);
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
/* Global Animations */
|
||||
@keyframes fadeInUp {
|
||||
from { opacity: 0; transform: translateY(30px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
.animate-up {
|
||||
animation: fadeInUp 0.8s ease forwards;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(13, 110, 253, 0.4); }
|
||||
70% { transform: scale(1.05); box-shadow: 0 0 0 10px rgba(13, 110, 253, 0); }
|
||||
100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(13, 110, 253, 0); }
|
||||
}
|
||||
|
||||
.pulse-animation {
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
|
||||
/* Footer Modernization */
|
||||
footer {
|
||||
background-color: #1a1d20;
|
||||
color: #adb5bd;
|
||||
padding: 80px 0 30px;
|
||||
border-top: 5px solid var(--primary-color);
|
||||
}
|
||||
|
||||
footer h5 {
|
||||
color: white;
|
||||
font-weight: 700;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
footer a {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
footer a:hover {
|
||||
color: white !important;
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.social-icons a {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background: rgba(255,255,255,0.05);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50%;
|
||||
margin-right: 10px;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.social-icons a:hover {
|
||||
background: var(--primary-color);
|
||||
transform: translateY(-3px);
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
/* Botão Flutuante do WhatsApp */
|
||||
.whatsapp-float {
|
||||
position: fixed;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
bottom: 90px;
|
||||
right: 33px;
|
||||
background-color: #25d366;
|
||||
color: #FFF;
|
||||
border-radius: 50px;
|
||||
text-align: center;
|
||||
font-size: 30px;
|
||||
box-shadow: 0 10px 25px rgba(37, 211, 102, 0.3);
|
||||
z-index: 1000;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-decoration: none;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.whatsapp-float:hover {
|
||||
background-color: #128c7e;
|
||||
color: #FFF;
|
||||
transform: scale(1.1) rotate(15deg);
|
||||
}
|
||||
.map-responsive {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding-bottom: 56.25%;
|
||||
overflow: hidden;
|
||||
}
|
||||
.map-responsive iframe {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* Dropdown Submenu */
|
||||
.dropdown-submenu {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.dropdown-submenu .dropdown-menu {
|
||||
top: 0;
|
||||
left: 100%;
|
||||
margin-top: -1px;
|
||||
margin-left: 0.1rem;
|
||||
border-radius: 0 0.375rem 0.375rem 0.375rem;
|
||||
}
|
||||
|
||||
.dropdown-submenu .dropdown-menu.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dropdown-item.dropdown-toggle::after {
|
||||
display: inline-block;
|
||||
margin-left: 0.255em;
|
||||
vertical-align: 0.255em;
|
||||
content: "";
|
||||
border-top: 0.3em solid;
|
||||
border-right: 0.3em solid transparent;
|
||||
border-bottom: 0;
|
||||
border-left: 0.3em solid transparent;
|
||||
float: right;
|
||||
}
|
||||
|
||||
/* Mobile Submenu */
|
||||
@media (max-width: 991.98px) {
|
||||
.dropdown-submenu .dropdown-menu {
|
||||
position: static;
|
||||
margin-left: 0;
|
||||
margin-top: 0;
|
||||
padding-left: 1.5rem;
|
||||
border: none;
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.whatsapp-float {
|
||||
bottom: 85px;
|
||||
right: 20px;
|
||||
width: 54px;
|
||||
height: 54px;
|
||||
font-size: 26px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@stack('css')
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- Navbar -->
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm sticky-top">
|
||||
<div class="container">
|
||||
<!-- Logo -->
|
||||
<a class="navbar-brand d-flex align-items-center" href="{{ route('index') }}">
|
||||
<div class="bg-primary text-white rounded-circle d-flex align-items-center justify-content-center me-2" style="width: 45px; height: 45px; box-shadow: 0 4px 10px rgba(13, 110, 253, 0.3);">
|
||||
<i class="bi bi-cpu"></i>
|
||||
</div>
|
||||
<div class="d-flex flex-column">
|
||||
<span class="fw-bold fs-4 text-primary lh-1">{{ $company->name }}</span>
|
||||
<small class="text-muted fw-normal" style="font-size: 0.7rem; letter-spacing: 1px;">SISTEMAS DE GESTÃO</small>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<!-- Botão do menu para celular -->
|
||||
<button class="navbar-toggler border-0 shadow-none" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<!-- Menu de links -->
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav ms-auto py-3 py-lg-0 align-items-center">
|
||||
@if(in_array('index', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('index') ? 'active' : '' }}" href="{{ route('index') }}">Início</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('about', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('about') ? 'active' : '' }}" href="{{ route('about') }}">Sobre</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('servicos', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('servicos') ? 'active' : '' }}" href="{{ route('servicos') }}">Serviços</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('servidores-linux', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('servidores-linux') ? 'active' : '' }}" href="{{ route('servidores-linux') }}">Linux</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('assistentes-digitais-com-ia', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('assistentes-digitais-ia') ? 'active' : '' }}" href="{{ route('assistentes-digitais-ia') }}">IA</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('erp', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('erp') ? 'active' : '' }}" href="{{ route('erp') }}">ERP</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('fluxo-de-caixa-pro', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('fluxo-de-caixa-pro') ? 'active' : '' }}" href="{{ route('fluxo-de-caixa-pro') }}">Fluxo Pro</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('produtos', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('produtos') ? 'active' : '' }}" href="{{ route('produtos') }}">Produtos</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(\App\Models\Setting::get('news_enabled', 'on') === 'on')
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('news.*') ? 'active' : '' }}" href="{{ route('news.index') }}">Notícias</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if($activeGalleries->count() > 0)
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle px-3 {{ request()->routeIs('gallery.*') ? 'active' : '' }}" href="#" id="navbarGalleries" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
Galerias
|
||||
</a>
|
||||
<ul class="dropdown-menu border-0 shadow-lg animate-up" aria-labelledby="navbarGalleries">
|
||||
@if(isset($activeGalleryCategories) && $activeGalleryCategories->count() > 0)
|
||||
@foreach($activeGalleryCategories as $cat)
|
||||
@if(isset($galleryCategories[$cat->name]))
|
||||
<li><a class="dropdown-item py-2" href="{{ route('gallery.category', $cat->slug) }}">{{ $cat->name }}</a></li>
|
||||
@endif
|
||||
@endforeach
|
||||
@else
|
||||
@foreach($activeGalleries as $gal)
|
||||
<li><a class="dropdown-item py-2" href="{{ route('gallery.show', $gal->slug) }}">{{ $gal->title }}</a></li>
|
||||
@endforeach
|
||||
@endif
|
||||
</ul>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('downloads', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('downloads') ? 'active' : '' }}" href="{{ route('downloads') }}">Downloads</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('faq', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('faq') ? 'active' : '' }}" href="{{ route('faq') }}">FAQ</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@if(in_array('contato', $activePages))
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('contato') ? 'active' : '' }}" href="{{ route('contato') }}">Contato</a>
|
||||
</li>
|
||||
@endif
|
||||
|
||||
@foreach($customPages as $customPage)
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('pages.show', $customPage->slug) ? 'active' : '' }}" href="{{ route('pages.show', $customPage->slug) }}">{{ $customPage->title }}</a>
|
||||
</li>
|
||||
@endforeach
|
||||
|
||||
@auth
|
||||
<li class="nav-item">
|
||||
<a class="nav-link px-3 {{ request()->routeIs('home') ? 'active' : '' }}" href="{{ route('home') }}">Dashboard</a>
|
||||
</li>
|
||||
@endauth
|
||||
|
||||
@guest
|
||||
<li class="nav-item ms-lg-3 mt-3 mt-lg-0">
|
||||
<a class="btn btn-outline-primary px-4 rounded-pill fw-bold" href="{{ route('login') }}">
|
||||
Login
|
||||
</a>
|
||||
</li>
|
||||
@else
|
||||
<li class="nav-item dropdown ms-lg-3 mt-3 mt-lg-0">
|
||||
<a id="navbarDropdown" class="nav-link dropdown-toggle btn btn-primary px-4 rounded-pill fw-bold text-white d-flex align-items-center" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
|
||||
@if(Auth::user()->avatar)
|
||||
<img src="{{ asset('storage/' . Auth::user()->avatar) }}" class="rounded-circle me-2" style="width: 25px; height: 25px; object-fit: cover;">
|
||||
@else
|
||||
<i class="bi bi-person-circle me-2"></i>
|
||||
@endif
|
||||
{{ Auth::user()->name }}
|
||||
</a>
|
||||
|
||||
<div class="dropdown-menu dropdown-menu-end shadow-lg border-0 rounded-3 mt-2 animate-up" aria-labelledby="navbarDropdown">
|
||||
<a class="dropdown-item py-2" href="{{ route('home') }}">
|
||||
<i class="bi bi-speedometer2 me-2 text-primary"></i> Dashboard
|
||||
</a>
|
||||
<a class="dropdown-item py-2" href="{{ route('profile.edit') }}">
|
||||
<i class="bi bi-person-gear me-2 text-primary"></i> Meu Perfil
|
||||
</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
<a class="dropdown-item py-2 text-danger" href="{{ route('logout') }}"
|
||||
onclick="event.preventDefault();
|
||||
document.getElementById('logout-form').submit();">
|
||||
<i class="bi bi-box-arrow-right me-2"></i> Sair
|
||||
</a>
|
||||
|
||||
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
|
||||
@csrf
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
@endguest
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main>
|
||||
@yield('content')
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer>
|
||||
<div class="container">
|
||||
<div class="row g-4">
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<div class="footer-info">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="bg-primary text-white rounded-circle d-flex align-items-center justify-content-center me-2" style="width: 40px; height: 40px;">
|
||||
<i class="bi bi-cpu"></i>
|
||||
</div>
|
||||
<h5 class="mb-0">{{ $company->name }}</h5>
|
||||
</div>
|
||||
<p class="mb-4">{{ \App\Models\Setting::get('company_slogan', 'Sua parceira em tecnologia e manutenção de informática.') }}</p>
|
||||
<div class="social-icons">
|
||||
@if($company->facebook)
|
||||
<a href="{{ $company->facebook }}" target="_blank" title="Facebook"><i class="bi bi-facebook"></i></a>
|
||||
@endif
|
||||
@if($company->instagram)
|
||||
<a href="{{ $company->instagram }}" target="_blank" title="Instagram"><i class="bi bi-instagram"></i></a>
|
||||
@endif
|
||||
@if($company->linkedin)
|
||||
<a href="{{ $company->linkedin }}" target="_blank" title="LinkedIn"><i class="bi bi-linkedin"></i></a>
|
||||
@endif
|
||||
@if($company->phone)
|
||||
<a href="https://wa.me/{{ preg_replace('/\D/', '', $company->phone) }}" target="_blank" title="WhatsApp"><i class="bi bi-whatsapp"></i></a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<h5>Links Rápidos</h5>
|
||||
<ul class="list-unstyled">
|
||||
@if(in_array('index', $activePages))
|
||||
<li class="mb-2"><a href="{{ route('index') }}" class="text-decoration-none text-white-50">Início</a></li>
|
||||
@endif
|
||||
@if(in_array('servicos', $activePages))
|
||||
<li class="mb-2"><a href="{{ route('servicos') }}" class="text-decoration-none text-white-50">Serviços</a></li>
|
||||
@endif
|
||||
@if(in_array('contato', $activePages))
|
||||
<li class="mb-2"><a href="{{ route('contato') }}" class="text-decoration-none text-white-50">Contato</a></li>
|
||||
@endif
|
||||
@if(in_array('politica-privacidade', $activePages))
|
||||
<li class="mb-2"><a href="{{ route('politica-privacidade') }}" class="text-decoration-none text-white-50">Privacidade e Termos</a></li>
|
||||
@endif
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-md-6">
|
||||
<h5>Onde Estamos</h5>
|
||||
<ul class="list-unstyled footer-contact">
|
||||
@if($company->address)
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-geo-alt text-primary mt-1 me-3"></i>
|
||||
<span>{{ $company->address }}</span>
|
||||
</li>
|
||||
@endif
|
||||
@if($company->phone)
|
||||
<li class="mb-3 d-flex align-items-center">
|
||||
<i class="bi bi-telephone text-primary me-3"></i>
|
||||
<span>{{ $company->phone }}</span>
|
||||
</li>
|
||||
@endif
|
||||
@if($company->email)
|
||||
<li class="mb-3 d-flex align-items-center">
|
||||
<i class="bi bi-envelope text-primary me-3"></i>
|
||||
<span>{{ $company->email }}</span>
|
||||
</li>
|
||||
@endif
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="my-5 border-secondary opacity-25">
|
||||
|
||||
<div class="row align-items-center">
|
||||
<div class="col-md-6 text-center text-md-start">
|
||||
<p class="mb-0">© {{ date('Y') }} {{ $company->name }}. Todos os direitos reservados.</p>
|
||||
</div>
|
||||
<div class="col-md-6 text-center text-md-end mt-3 mt-md-0">
|
||||
<p class="mb-0">Desenvolvido por <a href="https://syspanel.com.br" class="text-primary text-decoration-none fw-bold" target="_blank">SysPanel</a> com <a href="https://syssite.syspanel.com.br" class="text-primary text-decoration-none fw-bold" target="_blank">SysSiteCMS</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Botão Flutuante WhatsApp -->
|
||||
@if($whatsapp_enabled && $company->phone)
|
||||
<a href="https://wa.me/{{ preg_replace('/\D/', '', $company->phone) }}" class="whatsapp-float" target="_blank" title="Fale conosco pelo WhatsApp">
|
||||
<i class="bi bi-whatsapp"></i>
|
||||
</a>
|
||||
@endif
|
||||
|
||||
<!-- Banner de Cookies LGPD -->
|
||||
<div id="cookie-banner" class="fixed-bottom p-4 animate-up" style="display: none; z-index: 9999;">
|
||||
<div class="container">
|
||||
<div class="bg-dark text-white p-4 rounded-4 shadow-lg border border-secondary border-opacity-25">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-8 mb-3 mb-lg-0">
|
||||
<h6 class="fw-bold mb-2"><i class="bi bi-shield-check text-primary me-2"></i> Privacidade e Cookies</h6>
|
||||
<p class="small mb-0 opacity-75">
|
||||
Utilizamos cookies para melhorar sua experiência e oferecer conteúdos personalizados, de acordo com a nossa
|
||||
<a href="{{ route('politica-privacidade') }}" class="text-primary text-decoration-none fw-bold">Política de Privacidade</a>
|
||||
e a Lei Geral de Proteção de Dados (LGPD).
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-lg-4 text-lg-end">
|
||||
<button id="accept-cookies" class="btn btn-primary px-4 py-2 rounded-pill fw-bold">Aceitar Cookies</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bootstrap 5.3 JS -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Cookie Banner Logic
|
||||
const cookieBanner = document.getElementById('cookie-banner');
|
||||
const acceptBtn = document.getElementById('accept-cookies');
|
||||
|
||||
if (!localStorage.getItem('cookies_accepted')) {
|
||||
setTimeout(() => {
|
||||
cookieBanner.style.display = 'block';
|
||||
}, 1500);
|
||||
}
|
||||
|
||||
acceptBtn.addEventListener('click', function() {
|
||||
localStorage.setItem('cookies_accepted', 'true');
|
||||
cookieBanner.style.opacity = '0';
|
||||
setTimeout(() => {
|
||||
cookieBanner.style.display = 'none';
|
||||
}, 500);
|
||||
});
|
||||
// Navbar Scroll Effect
|
||||
window.addEventListener('scroll', function() {
|
||||
const navbar = document.querySelector('.navbar');
|
||||
if (window.scrollY > 50) {
|
||||
navbar.classList.add('scrolled', 'shadow');
|
||||
} else {
|
||||
navbar.classList.remove('scrolled', 'shadow');
|
||||
}
|
||||
});
|
||||
|
||||
// Password Toggle
|
||||
document.querySelectorAll('.toggle-password').forEach(button => {
|
||||
button.addEventListener('click', function() {
|
||||
const input = this.closest('.input-group').querySelector('input');
|
||||
const icon = this.querySelector('i');
|
||||
if (input.type === 'password') {
|
||||
input.type = 'text';
|
||||
icon.classList.replace('fa-eye', 'fa-eye-slash');
|
||||
} else {
|
||||
input.type = 'password';
|
||||
icon.classList.replace('fa-eye-slash', 'fa-eye');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Dropdown Submenu Toggle
|
||||
document.querySelectorAll('.dropdown-submenu .dropdown-toggle').forEach(function(element) {
|
||||
element.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
// Close other open submenus
|
||||
document.querySelectorAll('.dropdown-submenu .dropdown-menu.show').forEach(function(menu) {
|
||||
if (menu !== element.nextElementSibling) {
|
||||
menu.classList.remove('show');
|
||||
}
|
||||
});
|
||||
|
||||
// Toggle current submenu
|
||||
element.nextElementSibling.classList.toggle('show');
|
||||
});
|
||||
});
|
||||
|
||||
// Close submenus when clicking outside
|
||||
document.addEventListener('click', function(e) {
|
||||
if (!e.target.closest('.dropdown-submenu')) {
|
||||
document.querySelectorAll('.dropdown-submenu .dropdown-menu.show').forEach(function(menu) {
|
||||
menu.classList.remove('show');
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@stack('js')
|
||||
|
||||
@if(module_enabled('chatbot'))
|
||||
@includeIf('chatbot::partials.chat-widget')
|
||||
@endif
|
||||
</body>
|
||||
</html>
|
||||
Executable
+67
@@ -0,0 +1,67 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Login - Syspanel')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center align-items-center" style="min-height: 70vh;">
|
||||
<div class="col-md-5">
|
||||
<div class="card border-0 shadow-lg rounded-4 overflow-hidden">
|
||||
<div class="row g-0">
|
||||
<div class="col-12 bg-primary p-5 text-white text-center">
|
||||
<i class="bi bi-cpu fs-1 mb-3"></i>
|
||||
<h2 class="fw-bold">Bem-vindo de volta!</h2>
|
||||
<p class="mb-0 text-white-50">Acesse sua conta para gerenciar seus serviços.</p>
|
||||
</div>
|
||||
<div class="col-12 p-5 bg-white">
|
||||
<form action="#" method="POST">
|
||||
@csrf
|
||||
<div class="mb-4">
|
||||
<label for="email" class="form-label fw-bold">E-mail</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-envelope text-muted"></i></span>
|
||||
<input type="email" class="form-control bg-light border-start-0 ps-0" id="email" name="email" placeholder="seu@email.com" required autofocus>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<div class="d-flex justify-content-between">
|
||||
<label for="password" class="form-label fw-bold">Senha</label>
|
||||
<a href="#" class="text-decoration-none small">Esqueceu a senha?</a>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0"><i class="bi bi-lock text-muted"></i></span>
|
||||
<input type="password" class="form-control bg-light border-start-0 border-end-0 ps-0" id="password" name="password" placeholder="••••••••" required>
|
||||
<button class="btn btn-light border-start-0 toggle-password" type="button">
|
||||
<i class="bi bi-eye text-muted"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="remember" name="remember">
|
||||
<label class="form-check-label text-muted" for="remember">Lembrar de mim</label>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-lg w-100 py-3 fw-bold shadow-sm rounded-pill mb-4">
|
||||
Entrar
|
||||
</button>
|
||||
|
||||
<div class="text-center">
|
||||
<span class="text-muted">Não tem uma conta?</span>
|
||||
<a href="{{ route('contato') }}" class="text-decoration-none fw-bold">Fale conosco</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-4">
|
||||
<a href="{{ route('home') }}" class="text-muted text-decoration-none small">
|
||||
<i class="bi bi-arrow-left"></i> Voltar para o site
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+76
@@ -0,0 +1,76 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Notícias' . \App\Models\Setting::get('seo_title_suffix', ' - SysSiteCMS'))
|
||||
@section('meta_description', 'Acompanhe as últimas notícias e novidades.')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-5 fw-bold text-primary">Notícias</h1>
|
||||
<p class="lead text-muted">Acompanhe as últimas novidades e informações.</p>
|
||||
</div>
|
||||
|
||||
@if($newsList->count() > 0)
|
||||
<div class="row g-4">
|
||||
@foreach($newsList as $item)
|
||||
<div class="col-md-6 col-lg-4">
|
||||
<div class="card h-100 border-0 shadow-sm overflow-hidden">
|
||||
@if($item->featured_image)
|
||||
<a href="{{ route('news.show', $item->slug) }}">
|
||||
<img src="{{ asset('storage/' . $item->featured_image) }}" class="card-img-top" alt="{{ $item->title }}" style="height: 200px; object-fit: cover; transition: transform 0.3s;">
|
||||
</a>
|
||||
@else
|
||||
<a href="{{ route('news.show', $item->slug) }}">
|
||||
<div class="bg-light d-flex align-items-center justify-content-center" style="height: 200px;">
|
||||
<i class="bi bi-newspaper text-muted"></i>
|
||||
</div>
|
||||
</a>
|
||||
@endif
|
||||
<div class="card-body d-flex flex-column">
|
||||
<h5 class="card-title fw-bold">
|
||||
<a href="{{ route('news.show', $item->slug) }}" class="text-dark text-decoration-none">{{ $item->title }}</a>
|
||||
</h5>
|
||||
@if($item->summary)
|
||||
<p class="card-text text-muted flex-grow-1">{{ Str::limit($item->summary, 150) }}</p>
|
||||
@endif
|
||||
<div class="d-flex justify-content-between align-items-center mt-3">
|
||||
@if($item->author)
|
||||
<small class="text-muted"><i class="bi bi-person me-1"></i> {{ $item->author }}</small>
|
||||
@endif
|
||||
@if($item->published_at)
|
||||
<small class="text-muted"><i class="bi bi-calendar me-1"></i> {{ $item->published_at->format('d/m/Y') }}</small>
|
||||
@else
|
||||
<small class="text-muted"><i class="bi bi-calendar me-1"></i> {{ $item->created_at->format('d/m/Y') }}</small>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="mt-5 d-flex justify-content-center">
|
||||
{{ $newsList->links() }}
|
||||
</div>
|
||||
@else
|
||||
<div class="text-center py-5">
|
||||
<i class="bi bi-newspaper text-muted mb-3 d-block"></i>
|
||||
<p class="text-muted fs-5">Nenhuma notícia publicada no momento.</p>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="text-center mt-5">
|
||||
<a href="{{ route('index') }}" class="btn btn-outline-primary px-5 rounded-pill fw-bold">
|
||||
<i class="bi bi-arrow-left me-2"></i> Voltar ao Início
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('css')
|
||||
<style>
|
||||
.card:hover img {
|
||||
transform: scale(1.03);
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
Executable
+161
@@ -0,0 +1,161 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', ($news->seo_title ?: $news->title) . \App\Models\Setting::get('seo_title_suffix', ' - SysSiteCMS'))
|
||||
@section('meta_description', $news->seo_description ?: Str::limit($news->summary ?? $news->title, 160))
|
||||
@section('meta_keywords', $news->seo_keywords)
|
||||
@section('og_title', $news->title)
|
||||
@section('og_description', Str::limit($news->summary ?? $news->title, 200))
|
||||
@section('og_image', $news->featured_image ? asset('storage/' . $news->featured_image) : '')
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
<article>
|
||||
<!-- Header -->
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-5 fw-bold text-primary">{{ $news->title }}</h1>
|
||||
<div class="d-flex justify-content-center gap-4 text-muted mt-3">
|
||||
@if($news->author)
|
||||
<span><i class="bi bi-person me-1"></i> {{ $news->author }}</span>
|
||||
@endif
|
||||
<span><i class="bi bi-calendar me-1"></i> {{ ($news->published_at ?? $news->created_at)->format('d/m/Y H:i') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Featured Image -->
|
||||
@if($news->featured_image)
|
||||
<div class="text-center mb-5">
|
||||
<img src="{{ asset('storage/' . $news->featured_image) }}" alt="{{ $news->title }}" class="img-fluid rounded shadow-sm" style="max-height: 500px; object-fit: cover;">
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- Summary -->
|
||||
@if($news->summary)
|
||||
<div class="alert alert-light border-start border-primary border-4 ps-4 mb-4">
|
||||
<p class="lead mb-0">{{ $news->summary }}</p>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- Content -->
|
||||
@if($news->content)
|
||||
<div class="mb-5" style="line-height: 1.8; font-size: 1.1rem;">
|
||||
{!! nl2br(e($news->content)) !!}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- Additional Images Gallery -->
|
||||
@if($news->images->count() > 0)
|
||||
<div class="mb-5">
|
||||
<h3 class="fw-bold mb-4"><i class="bi bi-images me-2 text-primary"></i> Galeria de Imagens</h3>
|
||||
<div class="row g-3">
|
||||
@foreach($news->images as $index => $image)
|
||||
<div class="col-sm-6 col-md-4 col-lg-3">
|
||||
<div class="card h-100 border-0 shadow-sm overflow-hidden" style="cursor: pointer;" onclick="openCarousel({{ $index }})">
|
||||
<img src="{{ asset('storage/' . $image->file_path) }}" class="card-img-top" alt="{{ $image->description }}" style="height: 160px; object-fit: cover; transition: transform 0.3s;">
|
||||
@if($image->description)
|
||||
<div class="card-body p-2 text-center bg-light">
|
||||
<small class="text-muted">{{ $image->description }}</small>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</article>
|
||||
|
||||
<hr class="my-5">
|
||||
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<a href="{{ route('news.index') }}" class="btn btn-outline-primary px-4 rounded-pill fw-bold">
|
||||
<i class="bi bi-arrow-left me-2"></i> Todas as Notícias
|
||||
</a>
|
||||
<a href="{{ route('index') }}" class="btn btn-outline-secondary px-4 rounded-pill">
|
||||
<i class="bi bi-house me-2"></i> Início
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Carousel Modal for Additional Images -->
|
||||
@if($news->images->count() > 0)
|
||||
<div class="modal fade" id="newsCarouselModal" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-xl modal-dialog-centered">
|
||||
<div class="modal-content bg-dark border-0">
|
||||
<div class="modal-header border-0 pb-0">
|
||||
<h5 class="modal-title text-white" id="carouselImageTitle"></h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Fechar"></button>
|
||||
</div>
|
||||
<div class="modal-body p-0">
|
||||
<div id="newsCarousel" class="carousel slide" data-bs-ride="false">
|
||||
<div class="carousel-inner">
|
||||
@foreach($news->images as $index => $image)
|
||||
<div class="carousel-item {{ $index === 0 ? 'active' : '' }}" data-index="{{ $index }}" data-title="{{ $image->description ?? '' }}">
|
||||
<div class="d-flex align-items-center justify-content-center" style="min-height: 400px; max-height: 75vh;">
|
||||
<img src="{{ asset('storage/' . $image->file_path) }}" class="d-block img-fluid" alt="{{ $image->description }}" style="max-height: 75vh; object-fit: contain;">
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@if($news->images->count() > 1)
|
||||
<button class="carousel-control-prev" type="button" data-bs-target="#newsCarousel" data-bs-slide="prev">
|
||||
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Anterior</span>
|
||||
</button>
|
||||
<button class="carousel-control-next" type="button" data-bs-target="#newsCarousel" data-bs-slide="next">
|
||||
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Próxima</span>
|
||||
</button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer border-0 pt-0 justify-content-center">
|
||||
<span class="text-white-50" id="carouselCounter"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@endsection
|
||||
|
||||
@push('css')
|
||||
<style>
|
||||
.card[style*="cursor: pointer"]:hover img {
|
||||
transform: scale(1.05);
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@if($news->images->count() > 0)
|
||||
@push('js')
|
||||
<script>
|
||||
const totalImages = {{ $news->images->count() }};
|
||||
let carouselInstance = null;
|
||||
|
||||
function openCarousel(index) {
|
||||
if (!carouselInstance) {
|
||||
carouselInstance = new bootstrap.Carousel(document.getElementById('newsCarousel'));
|
||||
}
|
||||
carouselInstance.to(index);
|
||||
updateCounter(index);
|
||||
|
||||
const item = document.querySelector(`#newsCarousel .carousel-item[data-index="${index}"]`);
|
||||
if (item) {
|
||||
document.getElementById('carouselImageTitle').textContent = item.dataset.title;
|
||||
}
|
||||
|
||||
new bootstrap.Modal(document.getElementById('newsCarouselModal')).show();
|
||||
}
|
||||
|
||||
function updateCounter(index) {
|
||||
document.getElementById('carouselCounter').textContent = `${index + 1} / ${totalImages}`;
|
||||
}
|
||||
|
||||
document.getElementById('newsCarousel').addEventListener('slid.bs.carousel', function (e) {
|
||||
const activeItem = document.querySelector('#newsCarousel .carousel-item.active');
|
||||
const index = parseInt(activeItem.dataset.index);
|
||||
updateCounter(index);
|
||||
document.getElementById('carouselImageTitle').textContent = activeItem.dataset.title;
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@endif
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title)
|
||||
@section('meta_description', $page->meta_description)
|
||||
@section('meta_keywords', $page->meta_keywords)
|
||||
@section('og_title', $page->og_title)
|
||||
@section('og_description', $page->og_description)
|
||||
@section('og_image', $page->og_image)
|
||||
@section('canonical', $page->canonical_url)
|
||||
|
||||
@section('content')
|
||||
<div class="container py-5">
|
||||
{!! $page->content !!}
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
<!-- Math-based Captcha -->
|
||||
<div class="col-12 mb-4">
|
||||
<div class="p-3 bg-light rounded-3 border">
|
||||
<label class="form-label fw-bold mb-2">Verificação de Segurança</label>
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
@php
|
||||
$n1 = rand(1, 9);
|
||||
$n2 = rand(1, 9);
|
||||
session(['captcha_result' => $n1 + $n2]);
|
||||
@endphp
|
||||
<div class="bg-white px-3 py-2 rounded border fw-bold fs-5 shadow-sm text-primary" style="letter-spacing: 2px;">
|
||||
{{ $n1 }} + {{ $n2 }} = ?
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<input type="number" name="captcha" class="form-control form-control-lg @error('captcha') is-invalid @enderror" placeholder="Resultado" required>
|
||||
@error('captcha') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<small class="text-muted mt-2 d-block">Por favor, resolva a conta acima para provar que você não é um robô.</small>
|
||||
</div>
|
||||
</div>
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Política de Privacidade e Termos de Uso - ' . $company->name)
|
||||
@section('meta_description', 'Conheça nossos termos de uso e política de privacidade em conformidade com a LGPD (Lei Geral de Proteção de Dados).')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-light py-5">
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-10">
|
||||
<div class="bg-white p-5 rounded-4 shadow-sm border">
|
||||
<h1 class="display-5 fw-bold mb-4 text-primary">Política de Privacidade e Termos de Uso</h1>
|
||||
<p class="text-muted mb-5">Última atualização: {{ date('d/m/Y') }}</p>
|
||||
|
||||
<div class="content-section mb-5">
|
||||
<h3 class="fw-bold mb-3"><i class="bi bi-shield-check text-primary me-2"></i> 1. Introdução e LGPD</h3>
|
||||
<p>
|
||||
A <strong>{{ $company->name }}</strong>, em conformidade com a <strong>Lei Geral de Proteção de Dados Pessoais (Lei nº 13.709/2018 - LGPD)</strong>,
|
||||
reforça seu compromisso com a transparência e a segurança no tratamento dos seus dados pessoais.
|
||||
Esta política explica como coletamos, usamos e protegemos suas informações.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="content-section mb-5">
|
||||
<h3 class="fw-bold mb-3"><i class="bi bi-database text-primary me-2"></i> 2. Coleta de Dados</h3>
|
||||
<p>Coletamos informações das seguintes formas:</p>
|
||||
<ul>
|
||||
<li><strong>Informações fornecidas por você:</strong> Dados como nome, e-mail, telefone e empresa preenchidos em nossos formulários de contato ou cadastro.</li>
|
||||
<li><strong>Dados de navegação:</strong> Através de cookies e tecnologias similares, coletamos dados sobre seu endereço IP, tipo de navegador e páginas visitadas para melhorar sua experiência.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="content-section mb-5">
|
||||
<h3 class="fw-bold mb-3"><i class="bi bi-lock text-primary me-2"></i> 3. Finalidade do Tratamento</h3>
|
||||
<p>Seus dados são utilizados para:</p>
|
||||
<ul>
|
||||
<li>Responder a solicitações de suporte e orçamentos;</li>
|
||||
<li>Enviar comunicações de marketing e novidades (quando autorizado);</li>
|
||||
<li>Cumprir obrigações legais e regulatórias;</li>
|
||||
<li>Melhorar a segurança e performance do nosso site.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="content-section mb-5">
|
||||
<h3 class="fw-bold mb-3"><i class="bi bi-person-check text-primary me-2"></i> 4. Seus Direitos (LGPD)</h3>
|
||||
<p>Como titular dos dados, você possui os seguintes direitos garantidos pela lei brasileira:</p>
|
||||
<ul>
|
||||
<li>Confirmação da existência de tratamento;</li>
|
||||
<li>Acesso aos seus dados pessoais;</li>
|
||||
<li>Correção de dados incompletos ou inexatos;</li>
|
||||
<li>Anonimização, bloqueio ou eliminação de dados desnecessários;</li>
|
||||
<li>Revogação do consentimento a qualquer momento.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="content-section mb-5">
|
||||
<h3 class="fw-bold mb-3"><i class="bi bi-circle text-primary me-2"></i> 5. Política de Cookies</h3>
|
||||
<p>
|
||||
Utilizamos cookies essenciais para o funcionamento do site e cookies analíticos para entender como você interage com nossa plataforma.
|
||||
Você pode gerenciar suas preferências de cookies através das configurações do seu navegador.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="content-section mb-5">
|
||||
<h3 class="fw-bold mb-3"><i class="bi bi-mallet text-primary me-2"></i> 6. Termos de Uso</h3>
|
||||
<p>Ao utilizar este site, você concorda em:</p>
|
||||
<ul>
|
||||
<li>Fornecer informações verdadeiras e atualizadas;</li>
|
||||
<li>Não utilizar o site para atividades ilícitas ou que violem direitos de terceiros;</li>
|
||||
<li>Respeitar os direitos de propriedade intelectual da {{ $company->name }}.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="content-section">
|
||||
<h3 class="fw-bold mb-3"><i class="bi bi-envelope text-primary me-2"></i> 7. Contato</h3>
|
||||
<p>
|
||||
Para exercer seus direitos ou tirar dúvidas sobre esta política, entre em contato com nosso encarregado de dados através do e-mail:
|
||||
<a href="mailto:{{ $company->email }}" class="text-primary text-decoration-none fw-bold">{{ $company->email }}</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Executable
+126
@@ -0,0 +1,126 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Meu Perfil')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Meu Perfil</h1>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Informações Pessoais</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('profile.update') }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="row mb-4 justify-content-center">
|
||||
<div class="col-md-4 text-center">
|
||||
<label class="font-weight-bold d-block mb-3">Foto de Perfil</label>
|
||||
<div class="mb-3">
|
||||
@if($user->avatar)
|
||||
<img src="{{ asset('storage/' . $user->avatar) }}" class="img-profile rounded-circle shadow-sm" style="width: 150px; height: 150px; object-fit: cover;">
|
||||
@else
|
||||
<img src="https://ui-avatars.com/api/?name={{ urlencode($user->name) }}&background=4e73df&color=fff&size=150" class="img-profile rounded-circle shadow-sm" style="width: 150px; height: 150px; object-fit: cover;">
|
||||
@endif
|
||||
</div>
|
||||
<div class="custom-file">
|
||||
<input type="file" name="avatar" class="custom-file-input @error('avatar') is-invalid @enderror" id="avatarFile">
|
||||
<label class="custom-file-label" for="avatarFile" data-browse="Procurar">Escolher foto...</label>
|
||||
@error('avatar') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
<small class="text-muted mt-2 d-block">PNG, JPG ou JPEG (Máx 2MB)</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Nome</label>
|
||||
<input type="text" name="name" class="form-control @error('name') is-invalid @enderror" value="{{ old('name', $user->name) }}" required>
|
||||
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">E-mail</label>
|
||||
<input type="email" name="email" class="form-control @error('email') is-invalid @enderror" value="{{ old('email', $user->email) }}" required>
|
||||
@error('email') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group mb-3">
|
||||
<label class="font-weight-bold">Empresa</label>
|
||||
<input type="text" name="company" class="form-control @error('company') is-invalid @enderror" value="{{ old('company', $user->company) }}">
|
||||
@error('company') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">Site</label>
|
||||
<input type="text" name="website" class="form-control @error('website') is-invalid @enderror" value="{{ old('website', $user->website) }}">
|
||||
@error('website') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">WhatsApp</label>
|
||||
<input type="text" name="whatsapp" class="form-control @error('whatsapp') is-invalid @enderror" value="{{ old('whatsapp', $user->whatsapp) }}">
|
||||
@error('whatsapp') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="my-4">
|
||||
<h6 class="font-weight-bold text-primary mb-3"><i class="bi bi-lock me-1"></i> Segurança (Alterar Senha)</h6>
|
||||
<p class="text-muted small mb-3">Deixe em branco se não desejar alterar sua senha atual.</p>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">Nova Senha</label>
|
||||
<div class="input-group">
|
||||
<input type="password" name="password" class="form-control @error('password') is-invalid @enderror" placeholder="Mínimo 8 caracteres" autocomplete="new-password">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary toggle-password" type="button">
|
||||
<i class="bi bi-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
@error('password') <div class="invalid-feedback">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="font-weight-bold">Confirmar Nova Senha</label>
|
||||
<div class="input-group">
|
||||
<input type="password" name="password_confirmation" class="form-control" placeholder="Repita a nova senha" autocomplete="new-password">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary toggle-password" type="button">
|
||||
<i class="bi bi-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-2 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Atualizar Perfil
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('js')
|
||||
<script>
|
||||
// Mostrar o nome do arquivo selecionado no campo de upload
|
||||
document.getElementById('avatarFile').addEventListener('change', function(e){
|
||||
var fileName = document.getElementById("avatarFile").files[0].name;
|
||||
var nextSibling = e.target.nextElementSibling
|
||||
nextSibling.innerText = fileName
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
@extends('layouts.admin')
|
||||
|
||||
@section('title', 'Minhas Preferências')
|
||||
|
||||
@section('content')
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-4">
|
||||
<h1 class="h3 mb-0 text-gray-800">Preferências</h1>
|
||||
</div>
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-lg-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 font-weight-bold text-primary">Configurações da Conta</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route('profile.preferences.update') }}" method="POST">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="form-group mb-4">
|
||||
<label class="font-weight-bold d-block mb-3">Notificações</label>
|
||||
<div class="custom-control custom-switch mb-2">
|
||||
<input type="checkbox" name="notifications_email" class="custom-control-input" id="notif1" {{ ($preferences['notifications_email'] ?? true) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="notif1">Receber alertas de novas mensagens de contato por e-mail</label>
|
||||
</div>
|
||||
<div class="custom-control custom-switch mb-2">
|
||||
<input type="checkbox" name="notifications_system" class="custom-control-input" id="notif2" {{ ($preferences['notifications_system'] ?? true) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="notif2">Receber notificações internas do sistema</label>
|
||||
</div>
|
||||
<div class="custom-control custom-switch mb-2">
|
||||
<input type="checkbox" name="notifications_new_users" class="custom-control-input" id="notif3" {{ ($preferences['notifications_new_users'] ?? true) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="notif3">Receber notificações de novos cadastros de usuários</label>
|
||||
</div>
|
||||
<div class="custom-control custom-switch mb-2">
|
||||
<input type="checkbox" name="notifications_page_actions" class="custom-control-input" id="notif4" {{ ($preferences['notifications_page_actions'] ?? true) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="notif4">Receber notificações de criação ou edição de páginas</label>
|
||||
</div>
|
||||
<div class="custom-control custom-switch mb-2">
|
||||
<input type="checkbox" name="notifications_gallery_actions" class="custom-control-input" id="notif5" {{ ($preferences['notifications_gallery_actions'] ?? true) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="notif5">Receber notificações de criação ou edição de galerias de fotos</label>
|
||||
</div>
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" name="notifications_product_actions" class="custom-control-input" id="notif6" {{ ($preferences['notifications_product_actions'] ?? true) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="notif6">Receber notificações de criação ou edição de produtos</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(Auth::user()->user_type === 'Admin')
|
||||
<hr>
|
||||
<div class="form-group mb-4">
|
||||
<label class="font-weight-bold d-block mb-3 text-danger"><i class="bi bi-tools me-2"></i> Administração Global</label>
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" name="site_maintenance" class="custom-control-input" id="site_maintenance" {{ \App\Models\Setting::get('site_maintenance') == 'on' ? 'checked' : '' }}>
|
||||
<label class="custom-control-label font-weight-bold text-danger" for="site_maintenance">Site em Manutenção</label>
|
||||
<small class="d-block text-muted">Quando ativado, apenas administradores poderão acessar as páginas públicas do site.</small>
|
||||
</div>
|
||||
<div class="custom-control custom-switch mt-3">
|
||||
<input type="checkbox" name="public_registration" class="custom-control-input" id="public_registration" {{ \App\Models\Setting::get('public_registration') == 'on' ? 'checked' : '' }}>
|
||||
<label class="custom-control-label font-weight-bold" for="public_registration">Registro Público</label>
|
||||
<small class="d-block text-muted">Permitir que novos usuários se cadastrem livremente na página de login.</small>
|
||||
</div>
|
||||
<div class="custom-control custom-switch mt-3">
|
||||
<input type="checkbox" name="whatsapp_floating_button" class="custom-control-input" id="whatsapp_floating_button" {{ \App\Models\Setting::get('whatsapp_floating_button') == 'on' ? 'checked' : '' }}>
|
||||
<label class="custom-control-label font-weight-bold" for="whatsapp_floating_button">Botão Flutuante do WhatsApp</label>
|
||||
<small class="d-block text-muted">Exibir ícone do WhatsApp em todas as páginas públicas do site para contato rápido.</small>
|
||||
</div>
|
||||
|
||||
<!-- Configurações de Horário do WhatsApp -->
|
||||
<div id="whatsapp_hours_container" class="mt-3 p-3 border rounded bg-light {{ \App\Models\Setting::get('whatsapp_floating_button') == 'on' ? '' : 'd-none' }}">
|
||||
<label class="font-weight-bold mb-2 small text-uppercase">Horário de Exibição do Botão</label>
|
||||
<div class="row g-2">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-2">
|
||||
<label class="small">Início do Expediente</label>
|
||||
<input type="time" name="whatsapp_start_time" class="form-control form-control-sm" value="{{ \App\Models\Setting::get('whatsapp_start_time', '08:00') }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-2">
|
||||
<label class="small">Fim do Expediente</label>
|
||||
<input type="time" name="whatsapp_end_time" class="form-control form-control-sm" value="{{ \App\Models\Setting::get('whatsapp_end_time', '18:00') }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-0">
|
||||
<label class="small">Início Almoço (Opcional)</label>
|
||||
<input type="time" name="whatsapp_lunch_start" class="form-control form-control-sm" value="{{ \App\Models\Setting::get('whatsapp_lunch_start') }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group mb-0">
|
||||
<label class="small">Fim Almoço (Opcional)</label>
|
||||
<input type="time" name="whatsapp_lunch_end" class="form-control form-control-sm" value="{{ \App\Models\Setting::get('whatsapp_lunch_end') }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<small class="text-muted d-block mt-2">O botão só aparecerá no site durante os horários definidos acima.</small>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<button type="submit" class="btn btn-primary btn-block py-2 fw-bold shadow-sm">
|
||||
<i class="bi bi-floppy me-1"></i> Salvar Preferências
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@push('js')
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Toggle exibição das configurações de horário do WhatsApp
|
||||
$('#whatsapp_floating_button').on('change', function() {
|
||||
if($(this).is(':checked')) {
|
||||
$('#whatsapp_hours_container').removeClass('d-none');
|
||||
} else {
|
||||
$('#whatsapp_hours_container').addClass('d-none');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@endsection
|
||||
Executable
+252
@@ -0,0 +1,252 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('title', $page->title ?? 'Servidores Linux: Local e Nuvem')
|
||||
@section('meta_description', $page->meta_description ?? 'Implantação de servidores Linux robustos, seguros e de alta performance para sua empresa.')
|
||||
@section('meta_keywords', $page->meta_keywords ?? 'Linux, Servidores, Cloud, Local, Segurança, Monitoramento, Infraestrutura')
|
||||
@section('og_title', $page->og_title ?? 'Servidores Linux: Local e Nuvem')
|
||||
@section('og_description', $page->og_description ?? 'Infraestrutura robusta com Linux para o crescimento do seu negócio.')
|
||||
@section('og_image', $page->og_image ?? '')
|
||||
@section('canonical', $page->canonical_url ?? '')
|
||||
|
||||
@section('content')
|
||||
<style>
|
||||
.hero-gradient-linux {
|
||||
background: linear-gradient(135deg, #232526 0%, #414345 100%);
|
||||
}
|
||||
.linux-card {
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
transition: all 0.3s ease;
|
||||
background: #fff;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,0.05);
|
||||
}
|
||||
.linux-card:hover {
|
||||
transform: translateY(-10px);
|
||||
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
|
||||
}
|
||||
.icon-box {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background: rgba(13, 110, 253, 0.1);
|
||||
color: #0d6efd;
|
||||
border-radius: 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
.advantage-badge {
|
||||
background: #e9ecef;
|
||||
color: #495057;
|
||||
padding: 0.4rem 1rem;
|
||||
border-radius: 50px;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
display: inline-block;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
.section-divider {
|
||||
height: 4px;
|
||||
width: 60px;
|
||||
background: #0d6efd;
|
||||
margin: 1.5rem 0;
|
||||
border-radius: 2px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<section class="hero-gradient-linux py-5 text-white position-relative overflow-hidden">
|
||||
<div class="container py-5 position-relative z-2">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-7">
|
||||
<span class="badge bg-warning text-dark px-3 py-2 rounded-pill fw-bold mb-3">INFRAESTRUTURA CORPORATIVA</span>
|
||||
<h1 class="display-3 fw-bold mb-4">Servidores Linux de Alta Performance</h1>
|
||||
<p class="lead opacity-90 mb-5">
|
||||
Soluções sob medida para implantação de servidores locais e em nuvem. Estabilidade, segurança e o poder do código aberto para impulsionar sua empresa.
|
||||
</p>
|
||||
<div class="d-flex gap-3">
|
||||
<a href="#vantagens" class="btn btn-primary btn-lg px-4 rounded-pill fw-bold">Ver Vantagens</a>
|
||||
<a href="{{ route('contato') }}" class="btn btn-outline-light btn-lg px-4 rounded-pill fw-bold">Solicitar Orçamento</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-5 text-center d-none d-lg-block">
|
||||
<i class="bi bi-terminal text-white opacity-10 floating-animation"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Por que Linux? -->
|
||||
<section id="vantagens" class="py-5 bg-white">
|
||||
<div class="container py-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-6">
|
||||
<h2 class="display-5 fw-bold mb-4">Por que escolher Linux?</h2>
|
||||
<div class="section-divider"></div>
|
||||
<p class="text-muted fs-5 mb-4">
|
||||
O Linux é a espinha dorsal da internet moderna e das maiores infraestruturas corporativas do mundo. Suas vantagens são inquestionáveis:
|
||||
</p>
|
||||
<ul class="list-unstyled">
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-check-circle text-success mt-1 me-3"></i>
|
||||
<div><strong>Estabilidade Incomparável:</strong> Sistemas que rodam por meses ou anos sem necessidade de reinicialização.</div>
|
||||
</li>
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-check-circle text-success mt-1 me-3"></i>
|
||||
<div><strong>Segurança Robusta:</strong> Arquitetura pensada para proteção de dados e permissões granulares.</div>
|
||||
</li>
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-check-circle text-success mt-1 me-3"></i>
|
||||
<div><strong>Custo-Benefício:</strong> Sem taxas abusivas de licenciamento, permitindo maior investimento em hardware.</div>
|
||||
</li>
|
||||
<li class="mb-3 d-flex align-items-start">
|
||||
<i class="bi bi-check-circle text-success mt-1 me-3"></i>
|
||||
<div><strong>Performance Otimizada:</strong> Consumo eficiente de recursos, aproveitando ao máximo seu hardware.</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="row g-4">
|
||||
<div class="col-md-6">
|
||||
<div class="linux-card p-4 h-100">
|
||||
<div class="icon-box">
|
||||
<i class="bi bi-shield-check"></i>
|
||||
</div>
|
||||
<h4 class="fw-bold">Imunidade</h4>
|
||||
<p class="text-muted small">Arquitetura nativamente resistente a vírus e ameaças comuns em outros sistemas.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="linux-card p-4 h-100">
|
||||
<div class="icon-box">
|
||||
<i class="bi bi-terminal"></i>
|
||||
</div>
|
||||
<h4 class="fw-bold">Flexibilidade</h4>
|
||||
<p class="text-muted small">Totalmente customizável para atender desde pequenos escritórios até grandes datacenters.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Local vs Nuvem -->
|
||||
<section class="py-5 bg-light">
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h2 class="display-5 fw-bold">Local ou Nuvem?</h2>
|
||||
<p class="text-muted">Ajudamos você a escolher a melhor arquitetura para seu negócio</p>
|
||||
</div>
|
||||
<div class="row g-4">
|
||||
<div class="col-md-6">
|
||||
<div class="linux-card p-5 h-100 border-top border-primary border-4">
|
||||
<div class="advantage-badge">SERVIDORES LOCAIS</div>
|
||||
<h3 class="fw-bold mb-4">Controle Total e Velocidade</h3>
|
||||
<p class="text-muted">Ideal para empresas que precisam de acesso rápido a grandes volumes de dados ou possuem conexões de internet instáveis.</p>
|
||||
<ul class="list-unstyled mt-4">
|
||||
<li class="mb-2"><i class="bi bi-plus-lg text-primary me-2"></i> Latência zero na rede local</li>
|
||||
<li class="mb-2"><i class="bi bi-plus-lg text-primary me-2"></i> Independência total de internet para uso interno</li>
|
||||
<li class="mb-2"><i class="bi bi-plus-lg text-primary me-2"></i> Posse física dos dados e do hardware</li>
|
||||
<li class="mb-2"><i class="bi bi-plus-lg text-primary me-2"></i> Sem custos mensais de hospedagem cloud</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="linux-card p-5 h-100 border-top border-info border-4">
|
||||
<div class="advantage-badge">SERVIDORES EM NUVEM</div>
|
||||
<h3 class="fw-bold mb-4">Escalabilidade e Disponibilidade</h3>
|
||||
<p class="text-muted">Perfeito para negócios com equipes remotas, necessidade de acesso externo constante e alta escalabilidade.</p>
|
||||
<ul class="list-unstyled mt-4">
|
||||
<li class="mb-2"><i class="bi bi-plus-lg text-info me-2"></i> Acesso de qualquer lugar do mundo</li>
|
||||
<li class="mb-2"><i class="bi bi-plus-lg text-info me-2"></i> Alta disponibilidade garantida (99.9%)</li>
|
||||
<li class="mb-2"><i class="bi bi-plus-lg text-info me-2"></i> Backup automático e redundância</li>
|
||||
<li class="mb-2"><i class="bi bi-plus-lg text-info me-2"></i> Crescimento instantâneo de recursos</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Utilidades e Serviços -->
|
||||
<section class="py-5 bg-white">
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h2 class="display-5 fw-bold">Soluções Especializadas</h2>
|
||||
<p class="text-muted">O que podemos implementar para sua empresa</p>
|
||||
</div>
|
||||
<div class="row g-4">
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<div class="text-center p-4">
|
||||
<i class="bi bi-file-text text-primary mb-3"></i>
|
||||
<h5 class="fw-bold">Servidor de Arquivos</h5>
|
||||
<p class="text-muted small">Centralize e proteja os documentos da sua empresa com controle de acesso.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<div class="text-center p-4">
|
||||
<i class="bi bi-database text-primary mb-3"></i>
|
||||
<h5 class="fw-bold">Banco de Dados</h5>
|
||||
<p class="text-muted small">Instalação e tuning de MySQL, PostgreSQL e MariaDB para máxima performance.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<div class="text-center p-4">
|
||||
<i class="bi bi-globe text-primary mb-3"></i>
|
||||
<h5 class="fw-bold">Hospedagem Web</h5>
|
||||
<p class="text-muted small">Servidores Apache ou Nginx otimizados para sites e sistemas web.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-3 col-md-6">
|
||||
<div class="text-center p-4">
|
||||
<i class="bi bi-shield-check text-primary mb-3"></i>
|
||||
<h5 class="fw-bold">Firewall e VPN</h5>
|
||||
<p class="text-muted small">Segurança de rede e acesso remoto seguro para sua equipe.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Monitoramento e Segurança -->
|
||||
<section class="py-5 bg-dark text-white">
|
||||
<div class="container py-5">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-lg-6 mb-4 mb-lg-0">
|
||||
<h2 class="display-5 fw-bold mb-4">Monitoramento e Segurança 24/7</h2>
|
||||
<p class="lead opacity-75 mb-4">Não apenas instalamos; cuidamos do seu servidor para que você foque no seu negócio.</p>
|
||||
<div class="d-flex mb-3">
|
||||
<div class="me-3"><i class="bi bi-graph-up text-warning"></i></div>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-1">Métricas em Tempo Real</h5>
|
||||
<p class="small opacity-75">Monitoramos CPU, Memória, Disco e Rede para prevenir lentidões.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex mb-3">
|
||||
<div class="me-3"><i class="bi bi-shield-check text-warning"></i></div>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-1">Hardening de Sistema</h5>
|
||||
<p class="small opacity-75">Configurações avançadas de segurança para fechar portas e vulnerabilidades.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex">
|
||||
<div class="me-3"><i class="bi bi-clock-history text-warning"></i></div>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-1">Backups Automatizados</h5>
|
||||
<p class="small opacity-75">Rotinas diárias de cópias de segurança para garantir a continuidade do negócio.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6 px-lg-5">
|
||||
<div class="p-5 bg-white bg-opacity-10 rounded-4 backdrop-blur-sm border border-white border-opacity-10">
|
||||
<h4 class="fw-bold mb-4">Solicite um Diagnóstico</h4>
|
||||
<p class="small mb-4">Nossa equipe analisará sua infraestrutura atual e proporá a melhor solução Linux.</p>
|
||||
<a href="{{ route('contato') }}" class="btn btn-warning w-100 fw-bold py-3 rounded-pill">Falar com Especialista</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@endsection
|
||||
Executable
+225
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user