miscellaneous updates
@ -20,7 +20,7 @@ DB_CONNECTION=mysql
|
||||
DB_HOST=localhost
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=
|
||||
DB_USERNAME=root
|
||||
DB_USERNAME=
|
||||
DB_PASSWORD=
|
||||
|
||||
CACHE_STORE=database
|
||||
@ -32,7 +32,12 @@ SESSION_LIFETIME=120
|
||||
BROADCAST_CONNECTION=log
|
||||
FILESYSTEM_DISK=local
|
||||
|
||||
AUTH_MODEL=Modules\Admin\App\Models\User::class
|
||||
|
||||
MEMCACHED_HOST=127.0.0.1
|
||||
MEMCACHED_PORT=11211
|
||||
MEMCACHED_USERNAME=null
|
||||
MEMCACHED_PASSWORD=null
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
|
205
README.md
@ -1,66 +1,185 @@
|
||||
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
|
||||
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
|
||||
<a href="https://koneko.mx" target="_blank">
|
||||
<img src="https://git.koneko.mx/Koneko-ST/koneko-st/raw/branch/main/logo-images/horizontal-05.png" width="400" alt="Koneko Soluciones Tecnológicas Logo">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## About Laravel
|
||||
<p align="center">
|
||||
<a href="https://packagist.org/packages/koneko/laravel-vuexy-admin"><img src="https://img.shields.io/packagist/v/koneko/laravel-vuexy-admin" alt="Latest Stable Version"></a>
|
||||
<a href="https://packagist.org/packages/koneko/laravel-vuexy-admin"><img src="https://img.shields.io/packagist/l/koneko/laravel-vuexy-admin" alt="License"></a>
|
||||
<a href="mailto:contacto@koneko.mx"><img src="https://img.shields.io/badge/contact-email-green" alt="Email"></a>
|
||||
</p>
|
||||
|
||||
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
|
||||
---
|
||||
|
||||
- [Simple, fast routing engine](https://laravel.com/docs/routing).
|
||||
- [Powerful dependency injection container](https://laravel.com/docs/container).
|
||||
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
|
||||
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
|
||||
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
|
||||
- [Robust background job processing](https://laravel.com/docs/queues).
|
||||
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
|
||||
# Laravel Vuexy Admin para México
|
||||
|
||||
Laravel is accessible, powerful, and provides tools required for large, robust applications.
|
||||
**Laravel Vuexy Admin para México** es un proyecto basado en Laravel optimizado para necesidades específicas del mercado mexicano. Incluye integración con los catálogos del SAT (CFDI 4.0), herramientas avanzadas y una interfaz moderna inspirada en el template premium Vuexy.
|
||||
|
||||
## Learning Laravel
|
||||
## Características destacadas
|
||||
|
||||
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
|
||||
- **Optimización para México**:
|
||||
- Uso de los catálogos oficiales del SAT (versión CFDI 4.0):
|
||||
- Banco (`sat_banco`)
|
||||
- Clave de Producto o Servicio (`sat_clave_prod_serv`)
|
||||
- Clave de Unidad (`sat_clave_unidad`)
|
||||
- Forma de Pago (`sat_forma_pago`)
|
||||
- Moneda (`sat_moneda`)
|
||||
- Código Postal (`sat_codigo_postal`)
|
||||
- Régimen Fiscal (`sat_regimen_fiscal`)
|
||||
- País (`sat_pais`)
|
||||
- Uso CFDI (`sat_uso_cfdi`)
|
||||
- Colonia (`sat_colonia`)
|
||||
- Estado (`sat_estado`)
|
||||
- Localidad (`sat_localidad`)
|
||||
- Municipio (`sat_municipio`)
|
||||
- Deducción (`sat_deduccion`)
|
||||
- Percepción (`sat_percepcion`)
|
||||
- Compatible con los lineamientos y formatos del Anexo 20 del SAT.
|
||||
- Útil para generar comprobantes fiscales digitales (CFDI) y otros procesos administrativos locales.
|
||||
|
||||
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
|
||||
- **Otras características avanzadas**:
|
||||
- Autenticación y gestión de usuarios con Laravel Fortify.
|
||||
- Gestión de roles y permisos usando Spatie Permission.
|
||||
- Tablas dinámicas con Laravel Datatables y Yajra.
|
||||
- Integración con Redis para caching eficiente.
|
||||
- Exportación y manejo de Excel mediante Maatwebsite.
|
||||
|
||||
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
|
||||
## Requisitos del Sistema
|
||||
|
||||
## Laravel Sponsors
|
||||
- **PHP**: >= 8.2
|
||||
- **Composer**: >= 2.0
|
||||
- **Node.js**: >= 16.x
|
||||
- **MySQL** o cualquier base de datos compatible con Laravel.
|
||||
|
||||
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
|
||||
---
|
||||
|
||||
### Premium Partners
|
||||
## Instalación
|
||||
|
||||
- **[Vehikl](https://vehikl.com/)**
|
||||
- **[Tighten Co.](https://tighten.co)**
|
||||
- **[WebReinvent](https://webreinvent.com/)**
|
||||
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
|
||||
- **[64 Robots](https://64robots.com)**
|
||||
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
|
||||
- **[Cyber-Duck](https://cyber-duck.co.uk)**
|
||||
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
|
||||
- **[Jump24](https://jump24.co.uk)**
|
||||
- **[Redberry](https://redberry.international/laravel/)**
|
||||
- **[Active Logic](https://activelogic.com)**
|
||||
- **[byte5](https://byte5.de)**
|
||||
- **[OP.GG](https://op.gg)**
|
||||
Este proyecto ofrece dos métodos de instalación: mediante Composer o manualmente. A continuación, te explicamos ambos procesos.
|
||||
|
||||
## Contributing
|
||||
### Opción 1: Usar Composer (Recomendado)
|
||||
|
||||
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
|
||||
Para instalar el proyecto rápidamente usando Composer, ejecuta el siguiente comando:
|
||||
|
||||
## Code of Conduct
|
||||
```bash
|
||||
composer create-project koneko/laravel-vuexy-admin
|
||||
```
|
||||
|
||||
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
|
||||
Este comando realizará automáticamente los siguientes pasos:
|
||||
1. Configurará el archivo `.env` basado en `.env.example`.
|
||||
2. Generará la clave de la aplicación.
|
||||
|
||||
## Security Vulnerabilities
|
||||
Una vez completado, debes configurar una base de datos válida en el archivo `.env` y luego ejecutar:
|
||||
|
||||
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
|
||||
```bash
|
||||
php artisan migrate --seed
|
||||
```
|
||||
|
||||
## License
|
||||
Finalmente, compila los activos iniciales:
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Inicia el servidor local con:
|
||||
|
||||
```bash
|
||||
php artisan serve
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Opción 2: Instalación manual
|
||||
|
||||
Si prefieres instalar el proyecto de forma manual, sigue estos pasos:
|
||||
|
||||
1. Clona el repositorio:
|
||||
```bash
|
||||
git clone https://git.koneko.mx/Koneko-ST/laravel-vuexy-admin.git
|
||||
cd laravel-vuexy-admin
|
||||
```
|
||||
|
||||
2. Instala las dependencias de Composer:
|
||||
```bash
|
||||
composer install
|
||||
```
|
||||
|
||||
3. Instala las dependencias de npm:
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
4. Configura las variables de entorno:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
5. Configura una base de datos válida en el archivo `.env`.
|
||||
|
||||
6. Genera la clave de la aplicación:
|
||||
```bash
|
||||
php artisan key:generate
|
||||
```
|
||||
|
||||
7. Migra y llena la base de datos:
|
||||
```bash
|
||||
php artisan migrate --seed
|
||||
```
|
||||
|
||||
8. Compila los activos frontend:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
9. Inicia el servidor de desarrollo:
|
||||
```bash
|
||||
php artisan serve
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Notas importantes
|
||||
|
||||
- Asegúrate de tener instalado:
|
||||
- **PHP**: >= 8.2
|
||||
- **Composer**: >= 2.0
|
||||
- **Node.js**: >= 16.x
|
||||
- Este proyecto utiliza los catálogos SAT de la versión CFDI 4.0. Si deseas más información, visita la documentación oficial del SAT en [Anexo 20](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm).
|
||||
|
||||
---
|
||||
|
||||
## Uso del Template Vuexy
|
||||
|
||||
Este proyecto está diseñado para funcionar con el template premium [Vuexy](https://themeforest.net/item/vuexy-vuejs-html-laravel-admin-dashboard-template/23328599). Para utilizarlo:
|
||||
|
||||
1. Adquiere una licencia válida de Vuexy en [ThemeForest](https://themeforest.net/item/vuexy-vuejs-html-laravel-admin-dashboard-template/23328599).
|
||||
2. Incluye los archivos necesarios en las carpetas correspondientes (`resources`, `public`, etc.) de este proyecto.
|
||||
|
||||
---
|
||||
|
||||
## Créditos
|
||||
|
||||
Este proyecto utiliza herramientas y recursos de código abierto, así como un template premium. Queremos agradecer a los desarrolladores y diseñadores que hacen posible esta implementación:
|
||||
|
||||
- [Laravel](https://laravel.com)
|
||||
- [Vuexy Template](https://themeforest.net/item/vuexy-vuejs-html-laravel-admin-dashboard-template/23328599)
|
||||
- [Spatie Permission](https://spatie.be/docs/laravel-permission)
|
||||
- [Yajra Datatables](https://yajrabox.com/docs/laravel-datatables)
|
||||
|
||||
---
|
||||
|
||||
## Licencia
|
||||
|
||||
Este proyecto está licenciado bajo la licencia MIT. Consulta el archivo [LICENSE](LICENSE) para más detalles.
|
||||
|
||||
El template "Vuexy" debe adquirirse por separado y está sujeto a su propia licencia comercial.
|
||||
|
||||
---
|
||||
|
||||
<p align="center">
|
||||
Hecho con ❤️ por <a href="https://koneko.mx">Koneko Soluciones Tecnológicas</a>
|
||||
</p>
|
||||
|
||||
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
|
||||
|
@ -3,6 +3,7 @@
|
||||
namespace App\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Modules\Admin\App\Models\Setting;
|
||||
|
||||
class WebsiteTemplateService
|
||||
@ -25,9 +26,14 @@ class WebsiteTemplateService
|
||||
/**
|
||||
* Obtiene las variables del sitio web desde el caché o la base de datos.
|
||||
*/
|
||||
public function getWebsiteVars(String $setting = ''): array
|
||||
public function getWebsiteVars(string $setting = ''): array
|
||||
{
|
||||
try {
|
||||
// Verifica si la base de datos está inicializada
|
||||
if (!Schema::hasTable('migrations')) {
|
||||
return $this->getDefaultWebsiteVars($setting);
|
||||
}
|
||||
|
||||
$webVars = Cache::remember('website_settings', $this->cacheTTL, function () {
|
||||
$settings = Setting::global()
|
||||
->where(function ($query) {
|
||||
@ -38,31 +44,58 @@ class WebsiteTemplateService
|
||||
->pluck('value', 'key')
|
||||
->toArray();
|
||||
|
||||
return [
|
||||
'title' => $settings['website_title'] ?? config('_var.appTitle'),
|
||||
'author' => config('_var.author'),
|
||||
'description' => $settings['website_description'] ?? config('_var.appDescription'),
|
||||
'favicon' => $this->getFaviconPaths($settings),
|
||||
'app_name' => $settings['website_app_name'] ?? config('_var.appName'),
|
||||
'image_logo' => $this->getImageLogoPaths($settings),
|
||||
'template' => $this->getTemplateVars($settings),
|
||||
'google' => $this->getGoogleVars($settings),
|
||||
'chat' => $this->getChatVars($settings),
|
||||
'contact' => $this->getContactVars(),
|
||||
'social' => $this->getSocialVars(),
|
||||
];
|
||||
return $this->buildWebsiteVars($settings);
|
||||
});
|
||||
|
||||
return $setting
|
||||
? $webVars[$setting]
|
||||
: $webVars;
|
||||
return $setting ? ($webVars[$setting] ?? []) : $webVars;
|
||||
} catch (\Exception $e) {
|
||||
echo __METHOD__;
|
||||
echo "<br>" . $e->getMessage() . "<br><br>";
|
||||
die('You must configure the database.');
|
||||
// Manejo de excepciones: devolver valores predeterminados
|
||||
return $this->getDefaultWebsiteVars($setting);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Construye las variables del sitio web.
|
||||
*/
|
||||
private function buildWebsiteVars(array $settings): array
|
||||
{
|
||||
return [
|
||||
'title' => $settings['website_title'] ?? config('_var.appTitle'),
|
||||
'author' => config('_var.author'),
|
||||
'description' => $settings['website_description'] ?? config('_var.appDescription'),
|
||||
'favicon' => $this->getFaviconPaths($settings),
|
||||
'app_name' => $settings['website_app_name'] ?? config('_var.appName'),
|
||||
'image_logo' => $this->getImageLogoPaths($settings),
|
||||
'template' => $this->getTemplateVars($settings),
|
||||
'google' => $this->getGoogleVars($settings),
|
||||
'chat' => $this->getChatVars($settings),
|
||||
'contact' => $this->getContactVars(),
|
||||
'social' => $this->getSocialVars(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Devuelve las variables predeterminadas del sitio web.
|
||||
*/
|
||||
private function getDefaultWebsiteVars(string $setting = ''): array
|
||||
{
|
||||
$defaultVars = [
|
||||
'title' => config('_var.appTitle', 'Default Title'),
|
||||
'author' => config('_var.author', 'Default Author'),
|
||||
'description' => config('_var.appDescription', 'Default Description'),
|
||||
'favicon' => $this->getFaviconPaths([]),
|
||||
'app_name' => config('_var.appName', 'Default App Name'),
|
||||
'image_logo' => $this->getImageLogoPaths([]),
|
||||
'template' => $this->getTemplateVars([]),
|
||||
'google' => $this->getGoogleVars([]),
|
||||
'chat' => $this->getChatVars([]),
|
||||
'contact' => [],
|
||||
'social' => [],
|
||||
];
|
||||
|
||||
return $setting ? ($defaultVars[$setting] ?? []) : $defaultVars;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene los paths de favicon en distintos tamaños.
|
||||
*/
|
||||
@ -269,4 +302,4 @@ class WebsiteTemplateService
|
||||
? $legalDocuments[$legalDocument]
|
||||
: $legalDocuments;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,12 +1,14 @@
|
||||
{
|
||||
"name": "koneko/laravel-vuexy-admin",
|
||||
"name": "koneko/laravel-vuexy-admin-mexico",
|
||||
"type": "project",
|
||||
"description": "Template Laravel Vuexy Admin with fortify, Spatie, Redis, Taillwind and more...",
|
||||
"description": "Laravel Vuexy Admin para México. Un proyecto optimizado para México.",
|
||||
"keywords": [
|
||||
"laravel",
|
||||
"framework",
|
||||
"vuexy",
|
||||
"admin"
|
||||
"admin",
|
||||
"mexico",
|
||||
"Catálogos SAT"
|
||||
],
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
@ -80,4 +82,4 @@
|
||||
},
|
||||
"minimum-stability": "stable",
|
||||
"prefer-stable": true
|
||||
}
|
||||
}
|
||||
|
2
composer.lock
generated
@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "74ca673c06906baa677d4fc9af44d6a5",
|
||||
"content-hash": "08a4f5e6c8df4c107ea90b13425f6396",
|
||||
"packages": [
|
||||
{
|
||||
"name": "bacon/bacon-qr-code",
|
||||
|
204
config/auth.php
@ -2,114 +2,114 @@
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Defaults
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default authentication "guard" and password
|
||||
| reset "broker" for your application. You may change these values
|
||||
| as required, but they're a perfect start for most applications.
|
||||
|
|
||||
*/
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Defaults
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default authentication "guard" and password
|
||||
| reset "broker" for your application. You may change these values
|
||||
| as required, but they're a perfect start for most applications.
|
||||
|
|
||||
*/
|
||||
|
||||
'defaults' => [
|
||||
'guard' => env('AUTH_GUARD', 'web'),
|
||||
'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Guards
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Next, you may define every authentication guard for your application.
|
||||
| Of course, a great default configuration has been defined for you
|
||||
| which utilizes session storage plus the Eloquent user provider.
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| Supported: "session"
|
||||
|
|
||||
*/
|
||||
|
||||
'guards' => [
|
||||
'web' => [
|
||||
'driver' => 'session',
|
||||
'provider' => 'users',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| User Providers
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| If you have multiple user tables or models you may configure multiple
|
||||
| providers to represent the model / table. These providers may then
|
||||
| be assigned to any extra authentication guards you have defined.
|
||||
|
|
||||
| Supported: "database", "eloquent"
|
||||
|
|
||||
*/
|
||||
|
||||
'providers' => [
|
||||
'users' => [
|
||||
'driver' => 'eloquent',
|
||||
'model' => env('AUTH_MODEL', Modules\Admin\App\Models\User::class),
|
||||
'defaults' => [
|
||||
'guard' => env('AUTH_GUARD', 'web'),
|
||||
'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
|
||||
],
|
||||
|
||||
// 'users' => [
|
||||
// 'driver' => 'database',
|
||||
// 'table' => 'users',
|
||||
// ],
|
||||
],
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Guards
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Next, you may define every authentication guard for your application.
|
||||
| Of course, a great default configuration has been defined for you
|
||||
| which utilizes session storage plus the Eloquent user provider.
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| Supported: "session"
|
||||
|
|
||||
*/
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Resetting Passwords
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These configuration options specify the behavior of Laravel's password
|
||||
| reset functionality, including the table utilized for token storage
|
||||
| and the user provider that is invoked to actually retrieve users.
|
||||
|
|
||||
| The expiry time is the number of minutes that each reset token will be
|
||||
| considered valid. This security feature keeps tokens short-lived so
|
||||
| they have less time to be guessed. You may change this as needed.
|
||||
|
|
||||
| The throttle setting is the number of seconds a user must wait before
|
||||
| generating more password reset tokens. This prevents the user from
|
||||
| quickly generating a very large amount of password reset tokens.
|
||||
|
|
||||
*/
|
||||
|
||||
'passwords' => [
|
||||
'users' => [
|
||||
'provider' => 'users',
|
||||
'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
|
||||
'expire' => 60,
|
||||
'throttle' => 60,
|
||||
'guards' => [
|
||||
'web' => [
|
||||
'driver' => 'session',
|
||||
'provider' => 'users',
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Confirmation Timeout
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define the amount of seconds before a password confirmation
|
||||
| window expires and users are asked to re-enter their password via the
|
||||
| confirmation screen. By default, the timeout lasts for three hours.
|
||||
|
|
||||
*/
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| User Providers
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| All authentication guards have a user provider, which defines how the
|
||||
| users are actually retrieved out of your database or other storage
|
||||
| system used by the application. Typically, Eloquent is utilized.
|
||||
|
|
||||
| If you have multiple user tables or models you may configure multiple
|
||||
| providers to represent the model / table. These providers may then
|
||||
| be assigned to any extra authentication guards you have defined.
|
||||
|
|
||||
| Supported: "database", "eloquent"
|
||||
|
|
||||
*/
|
||||
|
||||
'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
|
||||
'providers' => [
|
||||
'users' => [
|
||||
'driver' => 'eloquent',
|
||||
'model' => env('AUTH_MODEL', App\Models\User::class),
|
||||
],
|
||||
|
||||
// 'users' => [
|
||||
// 'driver' => 'database',
|
||||
// 'table' => 'users',
|
||||
// ],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Resetting Passwords
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| These configuration options specify the behavior of Laravel's password
|
||||
| reset functionality, including the table utilized for token storage
|
||||
| and the user provider that is invoked to actually retrieve users.
|
||||
|
|
||||
| The expiry time is the number of minutes that each reset token will be
|
||||
| considered valid. This security feature keeps tokens short-lived so
|
||||
| they have less time to be guessed. You may change this as needed.
|
||||
|
|
||||
| The throttle setting is the number of seconds a user must wait before
|
||||
| generating more password reset tokens. This prevents the user from
|
||||
| quickly generating a very large amount of password reset tokens.
|
||||
|
|
||||
*/
|
||||
|
||||
'passwords' => [
|
||||
'users' => [
|
||||
'provider' => 'users',
|
||||
'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
|
||||
'expire' => 60,
|
||||
'throttle' => 60,
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Confirmation Timeout
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define the amount of seconds before a password confirmation
|
||||
| window expires and users are asked to re-enter their password via the
|
||||
| confirmation screen. By default, the timeout lasts for three hours.
|
||||
|
|
||||
*/
|
||||
|
||||
'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
|
||||
|
||||
];
|
||||
|
@ -100,7 +100,7 @@ return [
|
||||
| ignored by enabling the setting ignore_empty to true.
|
||||
|
|
||||
*/
|
||||
'ignore_empty' => false,
|
||||
'ignore_empty' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
@ -4,6 +4,7 @@ namespace Modules\Admin\App\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Modules\Admin\App\Models\Setting;
|
||||
|
||||
class AdminTemplateService
|
||||
@ -20,35 +21,61 @@ class AdminTemplateService
|
||||
return $setting->save();
|
||||
}
|
||||
|
||||
public function getAdminVars($adminSetting = false)
|
||||
public function getAdminVars($adminSetting = false): array
|
||||
{
|
||||
try {
|
||||
// Verificar si el sistema está inicializado (la tabla `migrations` existe)
|
||||
if (!Schema::hasTable('migrations')) {
|
||||
return $this->getDefaultAdminVars($adminSetting);
|
||||
}
|
||||
|
||||
// Cargar desde el caché o la base de datos si está disponible
|
||||
return Cache::remember('admin_settings', $this->cacheTTL, function () use ($adminSetting) {
|
||||
$settings = Setting::global()
|
||||
->where('key', 'LIKE', 'admin_%')
|
||||
->pluck('value', 'key')
|
||||
->toArray();
|
||||
|
||||
$adminSettings = [
|
||||
'title' => $settings['admin_title'] ?? config('_var.appTitle'),
|
||||
'author' => config('_var.author'),
|
||||
'description' => config('_var.description'),
|
||||
'favicon' => $this->getFaviconPaths($settings),
|
||||
'app_name' => $settings['admin_app_name'] ?? config('_var.appName'),
|
||||
'image_logo' => $this->getImageLogoPaths($settings),
|
||||
];
|
||||
$adminSettings = $this->buildAdminVarsArray($settings);
|
||||
|
||||
return $adminSetting
|
||||
? $adminSettings[$adminSetting]
|
||||
: $adminSettings;
|
||||
});
|
||||
} catch (\Exception $e) {
|
||||
echo __METHOD__;
|
||||
echo "<br>" . $e->getMessage() . "<br><br>";
|
||||
die('You must configure the database.');
|
||||
// En caso de error, devolver valores predeterminados
|
||||
return $this->getDefaultAdminVars($adminSetting);
|
||||
}
|
||||
}
|
||||
|
||||
private function getDefaultAdminVars($adminSetting = false): array
|
||||
{
|
||||
$defaultSettings = [
|
||||
'title' => config('_var.appTitle', 'Default Title'),
|
||||
'author' => config('_var.author', 'Default Author'),
|
||||
'description' => config('_var.description', 'Default Description'),
|
||||
'favicon' => $this->getFaviconPaths([]),
|
||||
'app_name' => config('_var.appName', 'Default App Name'),
|
||||
'image_logo' => $this->getImageLogoPaths([]),
|
||||
];
|
||||
|
||||
return $adminSetting
|
||||
? $defaultSettings[$adminSetting] ?? null
|
||||
: $defaultSettings;
|
||||
}
|
||||
|
||||
private function buildAdminVarsArray(array $settings): array
|
||||
{
|
||||
return [
|
||||
'title' => $settings['admin_title'] ?? config('_var.appTitle'),
|
||||
'author' => config('_var.author'),
|
||||
'description' => config('_var.description'),
|
||||
'favicon' => $this->getFaviconPaths($settings),
|
||||
'app_name' => $settings['admin_app_name'] ?? config('_var.appName'),
|
||||
'image_logo' => $this->getImageLogoPaths($settings),
|
||||
];
|
||||
}
|
||||
|
||||
public function getVuexyCustomizerVars()
|
||||
{
|
||||
// Obtener valores de la base de datos
|
||||
@ -126,4 +153,4 @@ class AdminTemplateService
|
||||
{
|
||||
Cache::forget("admin_settings");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Modules\Admin\App\Models\Setting;
|
||||
|
||||
class GlobalSettingsService
|
||||
@ -34,29 +35,57 @@ class GlobalSettingsService
|
||||
public function loadSystemConfig(): void
|
||||
{
|
||||
try {
|
||||
$config = Cache::remember('global_system_config', $this->cacheTTL, function () {
|
||||
$settings = Setting::global()
|
||||
->where('key', 'LIKE', 'config.%')
|
||||
->pluck('value', 'key')
|
||||
->toArray();
|
||||
if (!Schema::hasTable('migrations')) {
|
||||
// Base de datos no inicializada: usar valores predeterminados
|
||||
$config = $this->getDefaultSystemConfig();
|
||||
} else {
|
||||
// Cargar configuración desde la caché o base de datos
|
||||
$config = Cache::remember('global_system_config', $this->cacheTTL, function () {
|
||||
$settings = Setting::global()
|
||||
->where('key', 'LIKE', 'config.%')
|
||||
->pluck('value', 'key')
|
||||
->toArray();
|
||||
|
||||
return [
|
||||
'servicesFacebook' => $this->buildServiceConfig($settings, 'config.services.facebook.', 'services.facebook'),
|
||||
'servicesGoogle' => $this->buildServiceConfig($settings, 'config.services.google.', 'services.google'),
|
||||
'custom' => $this->buildVuexyCustomConfig($settings),
|
||||
];
|
||||
});
|
||||
return [
|
||||
'servicesFacebook' => $this->buildServiceConfig($settings, 'config.services.facebook.', 'services.facebook'),
|
||||
'servicesGoogle' => $this->buildServiceConfig($settings, 'config.services.google.', 'services.google'),
|
||||
'custom' => $this->buildVuexyCustomConfig($settings),
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
// Aplicar configuración al sistema
|
||||
Config::set('services.facebook', $config['servicesFacebook']);
|
||||
Config::set('services.google', $config['servicesGoogle']);
|
||||
Config::set('custom', $config['custom']);
|
||||
} catch (\Exception $e) {
|
||||
echo __METHOD__;
|
||||
echo "<br>" . $e->getMessage() . "<br><br>";
|
||||
die('You must configure the database.');
|
||||
// Manejo silencioso de errores para evitar interrupciones
|
||||
Config::set('services.facebook', config('services.facebook', []));
|
||||
Config::set('services.google', config('services.google', []));
|
||||
Config::set('custom', config('custom', []));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Devuelve una configuración predeterminada si la base de datos no está inicializada.
|
||||
*/
|
||||
private function getDefaultSystemConfig(): array
|
||||
{
|
||||
return [
|
||||
'servicesFacebook' => config('services.facebook', [
|
||||
'client_id' => '',
|
||||
'client_secret' => '',
|
||||
'redirect' => '',
|
||||
]),
|
||||
'servicesGoogle' => config('services.google', [
|
||||
'client_id' => '',
|
||||
'client_secret' => '',
|
||||
'redirect' => '',
|
||||
]),
|
||||
'custom' => config('custom', []),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifica si un bloque de configuraciones está presente.
|
||||
*/
|
||||
|
@ -26,8 +26,6 @@ class WebsiteSettingsService
|
||||
private $imageLogoMaxPixels2 = 75625; // Segunda versión (px^2) en Base64
|
||||
private $imageLogoMaxPixels3 = 230400; // Tercera versión (px^2)
|
||||
|
||||
protected $cacheTTL = 60 * 24 * 30; // 30 días en minutos
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->driver = config('image.driver', 'gd');
|
||||
|
@ -1,14 +1,14 @@
|
||||
name,email,role
|
||||
Administrador Web,webadmin@concierge.test,Administrador Web
|
||||
Productos y servicios,productos@concierge.test,Productos y servicios
|
||||
Recursos humanos,rrhh@concierge.test,Recursos humanos
|
||||
Nómina,nomina@concierge.test,Nómina
|
||||
Activos fijos,activos@concierge.test,Activos fijos
|
||||
Compras y gastos,compras@concierge.test,Compras y gastos
|
||||
CRM,crm@concierge.test,CRM
|
||||
Vendedor,vendedor@concierge.test,Vendedor
|
||||
Gerente,gerente@concierge.test,Gerente
|
||||
Facturación,facturacion@concierge.test,Facturación
|
||||
Facturación avanzado,facturacion_avanzado@concierge.test,Facturación avanzado
|
||||
Finanzas,finanzas@concierge.test,Finanzas
|
||||
Auditor,auditor@concierge.test,Auditor
|
||||
name,email,role,password
|
||||
Administrador Web,webadmin@concierge.test,Administrador Web,LAdmin123
|
||||
Productos y servicios,productos@concierge.test,Productos y servicios,LAdmin123
|
||||
Recursos humanos,rrhh@concierge.test,Recursos humanos,LAdmin123
|
||||
Nómina,nomina@concierge.test,Nómina,LAdmin123
|
||||
Activos fijos,activos@concierge.test,Activos fijos,LAdmin123
|
||||
Compras y gastos,compras@concierge.test,Compras y gastos,LAdmin123
|
||||
CRM,crm@concierge.test,CRM,LAdmin123
|
||||
Vendedor,vendedor@concierge.test,Vendedor,LAdmin123
|
||||
Gerente,gerente@concierge.test,Gerente,LAdmin123
|
||||
Facturación,facturacion@concierge.test,Facturación,LAdmin123
|
||||
Facturación avanzado,facturacion_avanzado@concierge.test,Facturación avanzado,LAdmin123
|
||||
Finanzas,finanzas@concierge.test,Finanzas,LAdmin123
|
||||
Auditor,auditor@concierge.test,Auditor,LAdmin123
|
||||
|
|
@ -10,7 +10,7 @@ class AdminDatabaseSeeder extends Seeder
|
||||
{
|
||||
$this->call(RoleSeeder::class);
|
||||
$this->call(UserSeeder::class);
|
||||
$this->call(SettingSeeder::class);
|
||||
//$this->call(SettingSeeder::class);
|
||||
$this->call(SATCatalogsSeeder::class);
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,6 @@ class SettingSeeder extends Seeder
|
||||
public function run()
|
||||
{
|
||||
$settings_array = [
|
||||
/*
|
||||
'app_title' => 'Quimiplastic S.A de C.V.',
|
||||
'app_faviconIcon' => '../assets/img/logo/koneko-02.png',
|
||||
'app_name' => 'Quimiplastic',
|
||||
@ -96,7 +95,7 @@ class SettingSeeder extends Seeder
|
||||
'chat.whatsapp.message' => '👋 Hola! Estoy buscando más información sobre Covirsa Soluciones en Tecnología. ¿Podrías proporcionarme los detalles que necesito? ¡Te lo agradecería mucho! 💻✨',
|
||||
|
||||
'webTpl.container' => 'custom-container',
|
||||
*/];
|
||||
];
|
||||
|
||||
foreach ($settings_array as $key => $value) {
|
||||
Setting::create([
|
||||
|
77
modules/Admin/Database/seeders/UserSeeder.php
Normal file
@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Admin\Database\seeders;
|
||||
|
||||
use Modules\Admin\App\Models\User;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class UserSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
// Define el disco y la carpeta
|
||||
$disk = 'public';
|
||||
$directory = 'profile-photos';
|
||||
|
||||
// Verifica si la carpeta existe
|
||||
if (Storage::disk($disk)->exists($directory))
|
||||
Storage::disk($disk)->deleteDirectory($directory);
|
||||
|
||||
// Arturo Corro
|
||||
$user = User::create([
|
||||
'name' => 'Koneko Admin',
|
||||
'email' => 'admin@koneko.mx',
|
||||
'email_verified_at' => now(),
|
||||
'password' => bcrypt('LAdmin123'),
|
||||
'status' => User::STATUS_ENABLED,
|
||||
])->assignRole('SuperAdmin');
|
||||
|
||||
$user->updateProfilePhoto(new UploadedFile(
|
||||
'public/assets/img/logo/koneko-02.png',
|
||||
'koneko-02.png'
|
||||
));
|
||||
|
||||
|
||||
// Webmaster admin
|
||||
$user = User::create([
|
||||
'name' => 'Admin',
|
||||
'email' => 'servers@koneko.mx',
|
||||
'email_verified_at' => now(),
|
||||
'password' => bcrypt('LAdmin123'),
|
||||
'status' => User::STATUS_ENABLED,
|
||||
])->assignRole('Admin');
|
||||
|
||||
$user->updateProfilePhoto(new UploadedFile(
|
||||
'public/assets/img/logo/koneko-03.png',
|
||||
'koneko-03.png'
|
||||
));
|
||||
|
||||
// Usuarios CSV
|
||||
$csvFile = fopen(base_path("modules/Admin/Database/data/users.csv"), "r");
|
||||
|
||||
$firstline = true;
|
||||
|
||||
while (($data = fgetcsv($csvFile, 2000, ",")) !== FALSE) {
|
||||
if (!$firstline) {
|
||||
User::create([
|
||||
'name' => $data['0'],
|
||||
'email' => $data['1'],
|
||||
'email_verified_at' => now(),
|
||||
'password' => bcrypt($data['3']),
|
||||
'status' => User::STATUS_ENABLED,
|
||||
])->assignRole($data['2']);
|
||||
}
|
||||
|
||||
$firstline = false;
|
||||
}
|
||||
|
||||
fclose($csvFile);
|
||||
}
|
||||
}
|
BIN
public/assets/img/logo/horizontal-02.png
Normal file
After Width: | Height: | Size: 219 KiB |
BIN
public/assets/img/logo/horizontal-04.png
Normal file
After Width: | Height: | Size: 219 KiB |
BIN
public/assets/img/logo/horizontal-circulo-01.png
Normal file
After Width: | Height: | Size: 123 KiB |
BIN
public/assets/img/logo/horizontal-circulo-03.png
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
public/assets/img/logo/koneko-01.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
public/assets/img/logo/koneko-02.png
Normal file
After Width: | Height: | Size: 96 KiB |
BIN
public/assets/img/logo/koneko-03.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
public/assets/img/logo/koneko-04.png
Normal file
After Width: | Height: | Size: 96 KiB |
69
public/assets/img/logo/koneko-ico.svg
Normal file
@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="595.28px" height="595.28px" viewBox="0 0 595.28 595.28" enable-background="new 0 0 595.28 595.28" xml:space="preserve">
|
||||
<path fill="#1A2633" d="M550.755,86.874c8.834-8.014,9.5-21.668,1.486-30.5c-8.012-8.834-21.664-9.5-30.498-1.488
|
||||
c-6.1,5.537-60.079,55.109-76.11,90.92c-5.912,13.205-7.15,31.532-4.78,55.171c0.142,1.405,0.282,2.811,0.448,4.255
|
||||
c4.881,42.324,20.602,100.925,41.744,177.167l2.301,8.301c11.565,41.734,20.351,77.316,10.675,90.037
|
||||
c-3.002,3.945-8.538,7.063-15.774,9.531c-7.811-146.764-35.873-231.179-52.177-268.888c-7.096-16.41-12.806-25.643-14.273-27.99
|
||||
c-24.253-40.404-67.307-94.077-87.411-108.625c-21.559-15.6-40.832-25.561-70.816-35.479c-1.416,11.371-1.403,18.625-2.583,33.521
|
||||
c-11.326-5.67-20.761-9.713-19.297-6.601c1.996,4.241,5.437,20.335,7.979,33.122c-4.114,3.243-8.08,6.714-12.028,10.142
|
||||
c-8.389,7.285-13.305,15.853-15.028,27.699c-0.03,0.212-0.075,0.421-0.107,0.629c-0.648-4.69-1.661-7.76-2.764-7.747
|
||||
c-1.792,0.024-3.139,8.148-3.009,18.145c0.057,4.324,0.38,8.287,0.875,11.394c-2.39,8.447-5.152,16.835-7.711,25.215
|
||||
c-2.132,6.979-0.929,12.301,4.238,17.096c1.48,1.376,2.778,2.942,4.154,4.427c5.074,5.463,10.39,9.779,15.933,13.004
|
||||
c8.807,5.124,18.2,7.469,28.146,7.186c0.892,0.172,1.399,0.263,1.399,0.263s0.362-0.137,1.004-0.38
|
||||
c5.128-0.359,10.4-1.398,15.812-3.102l7.398,40.879c-0.055-0.301-42.806,29.955-79.087,37.785c-0.032,0.006-0.059,0.016-0.089,0.02
|
||||
c-10.676,1.469-21.764,3.547-31.943,6.516c-1.458,0.428-2.87,0.861-4.251,1.299l-52.985-136.984c0,0-32.208-0.089-34.846,1.05
|
||||
c-5.53,2.384-8.083,8.798-5.702,14.329l54.592,126.742c-7.692,1.541-17.844,32.23,7.304,37.668c2.615,0.967,5.697,1.322,9.271,0.822
|
||||
l7.172,16.641c2.382,5.531,8.798,8.084,14.329,5.703c3.354-1.445,14.035-21.318,14.035-21.318c32.569,1.389,73.41,2.84,73.41,2.84
|
||||
c-5,10.695-9.305,20.662-11.867,29.881c-24.889-4.781-54.369-8.871-63.353-3.658c0,0-11.948,23.479-23.653,46.332
|
||||
c-14.621,1.289-18.456,1.453-19.234,0.158c-0.942-1.561-6.088-11.045-19.775-8.336c-13.688,2.709-2.85,17.885,0.159,22.883
|
||||
c2.041,3.389,5.44,12.613,22.644,15.934c0.117,0.023,0.267,0.045,0.402,0.066c-1.793,3.451-3.302,6.336-4.408,8.416
|
||||
c-8.901,16.75-10.975,30.215-14.699,30.549c-29.812,2.676-36.652,3.387-37.849,1.396c-1.199-1.99-7.76-14.08-25.209-10.627
|
||||
c-17.451,3.453-3.633,22.801,0.203,29.172c2.602,4.32,6.937,16.078,28.867,20.311c9.068,1.75,60.858,1.781,82.097-3.41
|
||||
c2.727-0.201,4.726-0.502,5.752-0.928c9.034-3.754,20.381-28.092,38.504-30.049c15.589-1.689,71.342,27.322,97.716,26.67l1.72,0.568
|
||||
c0-0.164-0.264-0.373-0.711-0.611c0.273-0.018,0.541-0.037,0.806-0.061l-0.095,0.672l72.061-0.07c0.448,0.027,0.895,0.07,1.35,0.07
|
||||
c3.563,0,7.045-0.02,10.486-0.047l22.904,0.047c0.365-0.186,0.742-0.348,1.107-0.527c25.459-0.881,47.021-3.004,64.789-7.346
|
||||
l0.018,0.004v-0.008c21.837-5.334,37.942-14.016,48.474-27.861c21.791-28.652,12.789-69.168-3.434-127.711l-2.303-8.307
|
||||
c-12.908-46.547-26.256-94.679-34.196-133.517c-10.895-53.272-7.418-69.423-5.418-73.893
|
||||
C495.513,140.059,536.032,100.237,550.755,86.874z M209.939,168.38c-0.35-2.778-0.585-6.323-0.635-10.192
|
||||
c-0.116-8.92,0.793-16.168,2.03-16.184c0.994-0.012,1.895,4.642,2.272,11.092C212.624,158.223,211.35,163.313,209.939,168.38z
|
||||
M224.716,180.545c-3.29,0.043-6.093-10.406-6.262-23.338c-0.168-12.932,2.362-23.449,5.653-23.491
|
||||
c3.29-0.042,6.093,10.405,6.263,23.337C230.538,169.984,228.006,180.502,224.716,180.545z M162.66,374.102L86.444,192.594
|
||||
l25.545-1.434l63.626,163.41L162.66,374.102z"/>
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="301.7852" y1="70.9863" x2="301.7851" y2="515.588">
|
||||
<stop offset="0.0054" style="stop-color:#1E2633"/>
|
||||
<stop offset="1" style="stop-color:#131424"/>
|
||||
</linearGradient>
|
||||
<path opacity="0.8" fill="url(#SVGID_1_)" enable-background="new " d="M550.755,86.874c8.834-8.014,9.5-21.668,1.486-30.5
|
||||
c-8.012-8.834-21.664-9.5-30.498-1.488c-6.1,5.537-60.079,55.109-76.11,90.92c-5.912,13.205-7.15,31.532-4.78,55.171
|
||||
c0.142,1.405,0.282,2.811,0.448,4.255c4.881,42.324,20.602,100.925,41.744,177.167l2.301,8.301
|
||||
c11.565,41.734,20.351,77.316,10.675,90.037c-3.002,3.945-8.538,7.063-15.774,9.531c-7.811-146.764-35.873-231.179-52.177-268.888
|
||||
c-7.096-16.41-12.806-25.643-14.273-27.99c-24.253-40.404-67.307-94.077-87.411-108.625c-21.559-15.6-40.832-25.561-70.816-35.479
|
||||
c-1.416,11.371-1.403,18.625-2.583,33.521c-11.326-5.67-20.761-9.713-19.297-6.601c1.996,4.241,5.437,20.335,7.979,33.122
|
||||
c-4.114,3.243-8.08,6.714-12.028,10.142c-8.389,7.285-13.305,15.853-15.028,27.699c-0.03,0.212-0.075,0.421-0.107,0.629
|
||||
c-0.648-4.69-1.661-7.76-2.764-7.747c-1.792,0.024-3.139,8.148-3.009,18.145c0.057,4.324,0.38,8.287,0.875,11.394
|
||||
c-2.39,8.447-5.152,16.835-7.711,25.215c-2.132,6.979-0.929,12.301,4.238,17.096c1.48,1.376,2.778,2.942,4.154,4.427
|
||||
c5.074,5.463,10.39,9.779,15.933,13.004c8.807,5.124,18.2,7.469,28.146,7.186c0.892,0.172,1.399,0.263,1.399,0.263
|
||||
s0.362-0.137,1.004-0.38c5.128-0.359,10.4-1.398,15.812-3.102l7.398,40.879c-0.055-0.301-42.806,29.955-79.087,37.785
|
||||
c-0.032,0.006-0.059,0.016-0.089,0.02c-10.676,1.469-21.764,3.547-31.943,6.516c-1.458,0.428-2.87,0.861-4.251,1.299
|
||||
l-52.985-136.984c0,0-32.208-0.089-34.846,1.05c-5.53,2.384-8.083,8.798-5.702,14.329l54.592,126.742
|
||||
c-7.692,1.541-17.844,32.23,7.304,37.668c2.615,0.967,5.697,1.322,9.271,0.822l7.172,16.641c2.382,5.531,8.798,8.084,14.329,5.703
|
||||
c3.354-1.445,14.035-21.318,14.035-21.318c32.569,1.389,73.41,2.84,73.41,2.84c-5,10.695-9.305,20.662-11.867,29.881
|
||||
c-24.889-4.781-54.369-8.871-63.353-3.658c0,0-11.948,23.479-23.653,46.332c-14.621,1.289-18.456,1.453-19.234,0.158
|
||||
c-0.942-1.561-6.088-11.045-19.775-8.336c-13.688,2.709-2.85,17.885,0.159,22.883c2.041,3.389,5.44,12.613,22.644,15.934
|
||||
c0.117,0.023,0.267,0.045,0.402,0.066c-1.793,3.451-3.302,6.336-4.408,8.416c-8.901,16.75-10.975,30.215-14.699,30.549
|
||||
c-29.812,2.676-36.652,3.387-37.849,1.396c-1.199-1.99-7.76-14.08-25.209-10.627c-17.451,3.453-3.633,22.801,0.203,29.172
|
||||
c2.602,4.32,6.937,16.078,28.867,20.311c9.068,1.75,60.858,1.781,82.097-3.41c2.727-0.201,4.726-0.502,5.752-0.928
|
||||
c9.034-3.754,20.381-28.092,38.504-30.049c15.589-1.689,71.342,27.322,97.716,26.67l1.72,0.568c0-0.164-0.264-0.373-0.711-0.611
|
||||
c0.273-0.018,0.541-0.037,0.806-0.061l-0.095,0.672l72.061-0.07c0.448,0.027,0.895,0.07,1.35,0.07c3.563,0,7.045-0.02,10.486-0.047
|
||||
l22.904,0.047c0.365-0.186,0.742-0.348,1.107-0.527c25.459-0.881,47.021-3.004,64.789-7.346l0.018,0.004v-0.008
|
||||
c21.837-5.334,37.942-14.016,48.474-27.861c21.791-28.652,12.789-69.168-3.434-127.711l-2.303-8.307
|
||||
c-12.908-46.547-26.256-94.679-34.196-133.517c-10.895-53.272-7.418-69.423-5.418-73.893
|
||||
C495.513,140.059,536.032,100.237,550.755,86.874z M209.939,168.38c-0.35-2.778-0.585-6.323-0.635-10.192
|
||||
c-0.116-8.92,0.793-16.168,2.03-16.184c0.994-0.012,1.895,4.642,2.272,11.092C212.624,158.223,211.35,163.313,209.939,168.38z
|
||||
M224.716,180.545c-3.29,0.043-6.093-10.406-6.262-23.338c-0.168-12.932,2.362-23.449,5.653-23.491
|
||||
c3.29-0.042,6.093,10.405,6.263,23.337C230.538,169.984,228.006,180.502,224.716,180.545z M162.66,374.102L86.444,192.594
|
||||
l25.545-1.434l63.626,163.41L162.66,374.102z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 7.2 KiB |
BIN
public/assets/img/logo/vertical-02.png
Normal file
After Width: | Height: | Size: 599 KiB |
BIN
public/assets/img/logo/vertical-04.png
Normal file
After Width: | Height: | Size: 599 KiB |
@ -1,101 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"Web App" => "Web App",
|
||||
"List of appointments" => "Listado de citas",
|
||||
"Calendar medico" => "Calendario Médico",
|
||||
"Vacations" => "Vacaciones",
|
||||
"Specialties" => "Especialidades",
|
||||
"Email contact" => "Correo de contacto",
|
||||
|
||||
"Billing API" => "API de facturación",
|
||||
"PAC status" => "Info. del Pack",
|
||||
|
||||
"Social media" => "Redes sociales",
|
||||
"Location" => "Ubicación",
|
||||
"Office hours" => "Horario consultorio",
|
||||
|
||||
"Online dating" => "Citas en línea",
|
||||
"Billing" => "Facturación",
|
||||
"Invoice consultation" => "Facturar consultas",
|
||||
"CFDI Ingresos" => "CFDI Ingresos",
|
||||
"CFDI 4.0 Catalogs" => "Catálogos CFDI 4.0",
|
||||
"Catalogs" => "Catálogos",
|
||||
|
||||
"CRM" => "CRM",
|
||||
"Diary" => "Agenda",
|
||||
"Diary settings" => "Configuraciones de Agenda",
|
||||
"QR Codes" => "Códigos QR",
|
||||
|
||||
"Dropdown Lists" => "Listas desplegables",
|
||||
"Agenda" => "Agenda",
|
||||
"koneko.mx" => "koneko.mx",
|
||||
"medico.esys.mx" => "medico.esys.mx",
|
||||
|
||||
"General setting" => "Ajustes generales",
|
||||
"Working hours" => "Horario laboral",
|
||||
"Working hours new users" => "Hor. nuevos usuarios",
|
||||
|
||||
"System users" => "Usuarios del sistema",
|
||||
|
||||
"medico users" => "Usuarios Médico",
|
||||
"System settings" => "Ajustes de sistema",
|
||||
"Settings" => "Ajustes",
|
||||
"Appointment tags" => "Etiquetas de citas",
|
||||
|
||||
"My page" => "Mi página",
|
||||
"Relationship" => "Amistades",
|
||||
"Colleagues" => "Colegas",
|
||||
"Galleries" => "Galerias",
|
||||
"Posts" => "Publicaciones",
|
||||
"My profile" => "Mi perfil",
|
||||
"User profile" => "Perfil de usuario",
|
||||
"Patients" => "Pacientes",
|
||||
"Doctors" => "Médicos",
|
||||
"Clinics" => "Médicos",
|
||||
"My account" => "Mi cuenta",
|
||||
|
||||
"Appointments and payments" => "Citas",
|
||||
"Administration" => "Administración",
|
||||
"Roles and permissions" => "Roles y permisos",
|
||||
"Payments" => "Pagos",
|
||||
"new payment" => "Nuevo pago",
|
||||
"Appointment, Calendar" => "Citas (Calendario)",
|
||||
"Appointment, List" => "Citas (Lista)",
|
||||
"Appointment" => "Cita",
|
||||
"Appointments" => "Citas",
|
||||
"Book appointment" => "Reservar una cita",
|
||||
"My services" => "Mis servicios",
|
||||
"Services" => "Servicios",
|
||||
"New service" => "Nuevo servicio",
|
||||
"Patients" => "Pacientes",
|
||||
"Secretaries" => "Secretárias",
|
||||
"Secretary" => "Secretaria",
|
||||
"Administrators" => "Administratores",
|
||||
"Security" => "Seguridad",
|
||||
"Legal contents" => "Contenidos legales",
|
||||
|
||||
"Roles" => "Roles",
|
||||
"Role" => "Role",
|
||||
"Permissions" => 'Permisos',
|
||||
|
||||
"new destination" => "Nuevo destino",
|
||||
"new post" => "Nueva publicación",
|
||||
|
||||
"about" => 'Acerca de',
|
||||
|
||||
"Destination" => "Destino",
|
||||
"Destinations" => "Destinos",
|
||||
|
||||
"Profiles" => "Perfiles",
|
||||
"Drop-down list" => "Listas desplegables",
|
||||
|
||||
"Slider" => "Rotador",
|
||||
"Newsletter" => "Boletín",
|
||||
|
||||
"Main" => "Principal",
|
||||
"Subscriptors" => "Suscriptores",
|
||||
|
||||
"Miscellaneous" => "Varios",
|
||||
"System" => "Sistema",
|
||||
"Users" => "Usuarios",
|
||||
|
18
resources/views/errors/404.blade.php
Normal file
@ -0,0 +1,18 @@
|
||||
@extends('layouts.porto.layout')
|
||||
|
||||
@section('title', 'Página no encontrada ¡Ups!')
|
||||
|
||||
@section('content')
|
||||
<!-- Error -->
|
||||
<div class="container-xxl container-p-y">
|
||||
<div class="misc-wrapper">
|
||||
<h1 class="mb-2 mx-2 fs-xxlarge" style="line-height: 6rem;font-size: 6rem;">404</h1>
|
||||
<h4 class="mb-2 mx-2">Página no encontrada ⚠️</h4>
|
||||
<p class="mb-6 mx-2">No pudimos encontrar la página que estás buscando.</p>
|
||||
<a href="{{url('/')}}" class="btn btn-primary mb-10">Regresar al inicio</a>
|
||||
<div class="mt-4">
|
||||
<img src="{{ asset('assets/admin/img/illustrations/page-misc-error.png') }}" alt="page-misc-error" width="225" class="img-fluid">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
@ -1,168 +1,147 @@
|
||||
@extends('layouts.porto.layout')
|
||||
@php
|
||||
use Illuminate\Support\Facades\Route;
|
||||
@endphp
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ session()->get('locale') ?? app()->getLocale() }}"
|
||||
data-assets-path="{{ asset('/assets') . '/' }}"
|
||||
data-base-url="{{ url('/') }}"
|
||||
data-route="{{ Route::currentRouteName() }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
@section('content')
|
||||
<div class="body coming-soon">
|
||||
<header id="header" data-plugin-options="{'stickyEnabled': false}">
|
||||
<div class="header-body border border-top-0 border-end-0 border-start-0">
|
||||
<div class="header-container container py-2">
|
||||
<div class="header-row">
|
||||
<div class="header-column">
|
||||
<div class="header-row">
|
||||
<p class="mb-0 text-dark"><strong>Get in touch!</strong> (123) 456-789</span><span
|
||||
class="d-none d-sm-inline-block ps-1"> | <a href="#">mail@domain.com</a></span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-column justify-content-end">
|
||||
<div class="header-row">
|
||||
<ul class="header-social-icons social-icons me-2">
|
||||
<li class="social-icons-facebook"><a href="http://www.facebook.com/" target="_blank"
|
||||
title="Facebook"><i class="fab fa-facebook-f"></i></a></li>
|
||||
<li class="social-icons-x"><a href="http://www.x.com/" target="_blank" title="X"><i
|
||||
class="fab fa-x-twitter"></i></a></li>
|
||||
<li class="social-icons-linkedin"><a href="http://www.linkedin.com/" target="_blank"
|
||||
title="Linkedin"><i class="fab fa-linkedin-in"></i></a></li>
|
||||
</ul>
|
||||
<div class="header-nav-features">
|
||||
<div class="header-nav-features-search-reveal-container">
|
||||
<div
|
||||
class="header-nav-feature header-nav-features-search header-nav-features-search-reveal d-inline-flex">
|
||||
<a href="#"
|
||||
class="header-nav-features-search-show-icon d-inline-flex text-decoration-none"><i
|
||||
class="fas fa-search header-nav-top-icon"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<title>@hasSection('title') @yield('title') | @endif{{ $_web['title'] }}</title>
|
||||
|
||||
<meta name="description" content="{{ $_web['description'] }}" />
|
||||
<meta name="author" content="{{ config('_var.author') }}">
|
||||
|
||||
<!-- laravel CRUD token -->
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<!-- Favicons-->
|
||||
<link rel="icon" href="{{ asset('storage/' . $_web['favicon']['16x16']) }}" type="image/x-icon">
|
||||
<link rel="icon" sizes="192x192" href="{{ asset('storage/' . $_web['favicon']['192x192']) }}">
|
||||
<link rel="apple-touch-icon" type="image/x-icon" sizes="76x76" href="{{ asset('storage/' . $_web['favicon']['76x76']) }}">
|
||||
<link rel="apple-touch-icon" type="image/x-icon" sizes="120x120" href="{{ asset('storage/' . $_web['favicon']['120x120']) }}">
|
||||
<link rel="apple-touch-icon" type="image/x-icon" sizes="152x152" href="{{ asset('storage/' . $_web['favicon']['152x152']) }}">
|
||||
<link rel="apple-touch-icon" type="image/x-icon" sizes="180x180" href="{{ asset('storage/' . $_web['favicon']['180x180']) }}">
|
||||
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
|
||||
<!-- Mobile Metas -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, shrink-to-fit=no">
|
||||
</head>
|
||||
<body class="bg-gray-50 text-gray-800">
|
||||
<!-- Header -->
|
||||
<header class="bg-white shadow">
|
||||
<div class="container mx-auto px-4 py-4 flex justify-between items-center">
|
||||
<a href="/" class="text-2xl font-bold text-blue-600">
|
||||
<img src="{{ asset('storage/' . $_web['image_logo']['small']) }}" style="width: 50px;" class="inline-block" alt="{{ $_web['app_name'] }}" />
|
||||
{{ $_web['app_name'] }}
|
||||
</a>
|
||||
<nav class="hidden md:flex space-x-6">
|
||||
<a href="#features" class="hover:text-blue-600">Características</a>
|
||||
<a href="#about" class="hover:text-blue-600">Sobre Nosotros</a>
|
||||
<a href="#contact" class="hover:text-blue-600">Contacto</a>
|
||||
</nav>
|
||||
<a href="/login" class="hidden md:block px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-500">Ingresar</a>
|
||||
<button class="md:hidden text-gray-600 focus:outline-none" id="menu-btn">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<nav class="md:hidden bg-white shadow hidden" id="menu">
|
||||
<a href="#features" class="block px-4 py-2 hover:bg-gray-100">Características</a>
|
||||
<a href="#about" class="block px-4 py-2 hover:bg-gray-100">Sobre Nosotros</a>
|
||||
<a href="#contact" class="block px-4 py-2 hover:bg-gray-100">Contacto</a>
|
||||
<a href="/login" class="block px-4 py-2 bg-blue-600 text-white text-center hover:bg-blue-500">Ingresar</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<section class="bg-blue-600 text-white">
|
||||
<div class="container mx-auto px-4 py-16 text-center">
|
||||
<h1 class="text-4xl font-bold mb-4">Bienvenido a {{ $_web['title'] }}</h1>
|
||||
<p class="text-lg mb-6">El mejor administrador para negocios en México, optimizado con los catálogos SAT y herramientas avanzadas.</p>
|
||||
<a href="/login" class="px-6 py-3 bg-white text-blue-600 rounded shadow hover:bg-gray-100">Empezar ahora</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<pre>
|
||||
@php
|
||||
print_r($_web);
|
||||
@endphp
|
||||
</pre>
|
||||
|
||||
<!-- Features -->
|
||||
<section id="features" class="py-16">
|
||||
<div class="container mx-auto px-4">
|
||||
<h2 class="text-3xl font-bold text-center mb-8">Características</h2>
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
|
||||
<div class="bg-white shadow p-6 rounded">
|
||||
<h3 class="text-xl font-bold mb-2">Optimización SAT</h3>
|
||||
<p class="text-gray-600">Automatiza y gestiona tus procesos fiscales con los catálogos CFDI 4.0.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-nav-features header-nav-features-no-border p-static">
|
||||
<div
|
||||
class="header-nav-feature header-nav-features-search header-nav-features-search-reveal header-nav-features-search-reveal-big-search header-nav-features-search-reveal-big-search-full">
|
||||
<div class="container">
|
||||
<div class="row h-100 d-flex">
|
||||
<div class="col h-100 d-flex">
|
||||
<form role="search" class="d-flex h-100 w-100" action="page-search-results.html"
|
||||
method="get">
|
||||
<div class="big-search-header input-group">
|
||||
<input class="form-control text-1" id="headerSearch" name="q" type="search"
|
||||
value="" placeholder="Type and hit enter...">
|
||||
<a href="#" class="header-nav-features-search-hide-icon"><i
|
||||
class="fas fa-times header-nav-top-icon"></i></a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white shadow p-6 rounded">
|
||||
<h3 class="text-xl font-bold mb-2">Interfaz moderna</h3>
|
||||
<p class="text-gray-600">Diseño limpio y responsivo con tecnología de última generación.</p>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div role="main" class="main" style="min-height: calc(100vh - 393px);">
|
||||
|
||||
<pre>
|
||||
@php
|
||||
print_r($_web);
|
||||
@endphp
|
||||
</pre>
|
||||
|
||||
|
||||
<div class="container">
|
||||
<div class="row mt-5">
|
||||
<div class="col text-center">
|
||||
<div class="logo">
|
||||
<a href="index.html">
|
||||
<img width="100" height="48" src="/assets/img/logo-default-slim.png" alt="Porto">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white shadow p-6 rounded">
|
||||
<h3 class="text-xl font-bold mb-2">Herramientas avanzadas</h3>
|
||||
<p class="text-gray-600">Spatie Permission, Redis, Excel y más para tu negocio.</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<hr class="solid my-5">
|
||||
</div>
|
||||
</div>
|
||||
<section class="http-error py-0">
|
||||
<div class="row justify-content-center py-3">
|
||||
<div class="col-6 text-center">
|
||||
<div class="http-error-main">
|
||||
<h2 class="mb-0">500!</h2>
|
||||
<span class="text-6 font-weight-bold text-color-dark">UNEXPECTED ERROR</span>
|
||||
<p class="text-3 my-4 line-height-8">An unexpected error has occured. Lorem ipsum dolor sit
|
||||
amet, consectetur adipiscing elit. Phasellus blandit massa enim.</p>
|
||||
</div>
|
||||
<a href="index.html"
|
||||
class="btn btn-primary btn-rounded btn-xl font-weight-semibold text-2 px-4 py-3 mt-1 mb-4"><i
|
||||
class="fas fa-angle-left pe-3"></i>GO BACK TO HOME PAGE</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer id="footer">
|
||||
<div class="container">
|
||||
<div class="row py-5">
|
||||
<div class="col-md-4 d-flex justify-content-center justify-content-md-start mb-4 mb-lg-0">
|
||||
<a href="index.html" class="logo pe-0 pe-lg-3 ps-3 ps-md-0">
|
||||
<img alt="Porto Website Template" src="/assets/img/logo-footer.png" height="32">
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-md-8 d-flex justify-content-center justify-content-md-end mb-4 mb-lg-0">
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3 mb-md-0">
|
||||
<div class="ms-3 text-center text-md-end">
|
||||
<h5 class="text-3 mb-0 text-color-light">NEW YORK</h5>
|
||||
<p class="text-4 mb-0"><i
|
||||
class="fab fa-whatsapp text-color-primary top-1 p-relative"></i><span
|
||||
class="ps-1">(123) 465-7890</span></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="ms-3 text-center text-md-end">
|
||||
<h5 class="text-3 mb-0 text-color-light">LOS ANGELES</h5>
|
||||
<p class="text-4 mb-0"><i
|
||||
class="fab fa-whatsapp text-color-primary top-1 p-relative"></i><span
|
||||
class="ps-1">(123) 465-7890</span></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-copyright footer-copyright-style-2">
|
||||
<div class="container py-2">
|
||||
<div class="row py-4">
|
||||
<div
|
||||
class="col-md-4 d-flex align-items-center justify-content-center justify-content-md-start mb-2 mb-lg-0">
|
||||
<p>© Copyright 2024. All Rights Reserved.</p>
|
||||
</div>
|
||||
<div
|
||||
class="col-md-8 d-flex align-items-center justify-content-center justify-content-md-end mb-4 mb-lg-0">
|
||||
<p><i class="far fa-envelope text-color-primary top-1 p-relative"></i><a
|
||||
href="mailto:mail@example.com" class="opacity-7 ps-1">mail@example.com</a></p>
|
||||
<ul class="footer-social-icons social-icons social-icons-clean social-icons-icon-light ms-3">
|
||||
<li class="social-icons-facebook"><a href="http://www.facebook.com/" target="_blank"
|
||||
title="Facebook"><i class="fab fa-facebook-f text-2"></i></a></li>
|
||||
<li class="social-icons-x"><a href="http://www.x.com/" target="_blank" title="X"><i
|
||||
class="fab fa-x-twitter text-2"></i></a></li>
|
||||
<li class="social-icons-linkedin"><a href="http://www.linkedin.com/" target="_blank"
|
||||
title="Linkedin"><i class="fab fa-linkedin-in text-2"></i></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<a class="style-switcher-open-loader" href="#" data-base-path="" data-skin-src="" data-bs-toggle="tooltip"
|
||||
data-bs-animation="false" data-bs-placement="right" title="Style Switcher" aria-label="Style Switcher"><i
|
||||
class="fas fa-cogs"></i>
|
||||
<div class="style-switcher-tooltip"><strong>Style Switcher</strong>
|
||||
<p>Check out different color options and styles.</p>
|
||||
<!-- About -->
|
||||
<section id="about" class="bg-gray-100 py-16">
|
||||
<div class="container mx-auto px-4 text-center">
|
||||
<h2 class="text-3xl font-bold mb-4">Sobre Nosotros</h2>
|
||||
<p class="text-gray-600 max-w-3xl mx-auto">Koneko es una empresa dedicada a ofrecer soluciones tecnológicas avanzadas, centradas en la eficiencia y la simplicidad para negocios en México. Nuestro objetivo es facilitar tus operaciones.</p>
|
||||
</div>
|
||||
</a>
|
||||
@endsection
|
||||
</section>
|
||||
|
||||
<!-- Contact -->
|
||||
<section id="contact" class="py-16">
|
||||
<div class="container mx-auto px-4">
|
||||
<h2 class="text-3xl font-bold text-center mb-4">Contáctanos</h2>
|
||||
<p class="text-gray-600 text-center mb-8">¿Tienes preguntas o necesitas más información? Estamos aquí para ayudarte.</p>
|
||||
<div class="max-w-lg mx-auto bg-white shadow p-6 rounded">
|
||||
<form action="#" method="POST">
|
||||
<div class="mb-4">
|
||||
<label for="name" class="block text-gray-600">Nombre</label>
|
||||
<input type="text" id="name" name="name" class="w-full">
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="email" class="block text-gray-600">Correo Electrónico</label>
|
||||
<input type="email" id="email" name="email" class="w-full">
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="message" class="block text-gray-600">Mensaje</label>
|
||||
<textarea id="message" name="message" rows="4" class="w-full"></textarea>
|
||||
</div>
|
||||
<button type="submit" class="w-full bg-blue-600 text-white py-2 rounded hover:bg-blue-500">Enviar</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="bg-blue-600 text-white py-6">
|
||||
<div class="container mx-auto text-center">
|
||||
<p>© 2025 Koneko Soluciones Tecnológicas. Todos los derechos reservados.</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
const menuBtn = document.getElementById('menu-btn');
|
||||
const menu = document.getElementById('menu');
|
||||
|
||||
menuBtn.addEventListener('click', () => {
|
||||
menu.classList.toggle('hidden');
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|