Primer carga de contenido a servidor de producción y anexo de claves

This commit is contained in:
2026-02-18 08:47:47 -06:00
parent 9418875189
commit 61637ae4bc
11 changed files with 480 additions and 2 deletions
+87
View File
@@ -0,0 +1,87 @@
<?php
namespace App\Http\Controllers;
use App\Mail\ExampleMail;
use App\Models\Plantel;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Mail;
class MailController extends Controller
{
public function __construct() {
$this->middleware('can:mail.index')->only('index','show');
$this->middleware('can:mail.create')->only('create','store');
$this->middleware('can:mail.edit')->only('edit','update');
$this->middleware('can:mail.destroy')->only('destroy');
}
public function index()
{
$plantels=Plantel::all();
$users=User::with('roles')->get();
return view('mail.index',compact('users','plantels'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
public function mailme(User $user){
Mail::to($user->email)->send(new ExampleMail($user));
session()->flash('swal',[
'icon'=>'success',
'title'=>'Enviado!',
'text'=>'Se ha enviado el correo correctamente'
]);
return redirect()->route('mail.index');
}
}
+40
View File
@@ -0,0 +1,40 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
use Illuminate\Mail\Mailables\Address;
class ExampleMail extends Mailable
{
use Queueable, SerializesModels;
public function __construct(public $user)
{
//
}
public function envelope(): Envelope
{
return new Envelope(
subject: 'Example Mail',
from: new Address(env("MAIL_FROM_ADDRESS"),env("MAIL_FROM_NAME"))
);
}
public function content(): Content
{
return new Content(
view: 'emails.example',
);
}
public function attachments(): array
{
return [];
}
}
-2
View File
@@ -1,8 +1,6 @@
<?php <?php
namespace Database\Seeders; namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
+5
View File
@@ -111,5 +111,10 @@ class RoleSeeder extends Seeder
Permission::create(['name'=>'asistencia.edit','description'=>'Editar asistencias'])->syncRoles([$role1]); Permission::create(['name'=>'asistencia.edit','description'=>'Editar asistencias'])->syncRoles([$role1]);
Permission::create(['name'=>'asistencia.destroy','description'=>'Eliminar asistencias'])->syncRoles([$role1]); Permission::create(['name'=>'asistencia.destroy','description'=>'Eliminar asistencias'])->syncRoles([$role1]);
Permission::create(['name'=>'mail.index','description'=>'Ver mail'])->syncRoles([$role1]);
Permission::create(['name'=>'mail.create','description'=>'Crear mail'])->syncRoles([$role1]);
Permission::create(['name'=>'mail.edit','description'=>'Editar mail'])->syncRoles([$role1]);
Permission::create(['name'=>'mail.destroy','description'=>'Eliminar mail'])->syncRoles([$role1]);
} }
} }
+21
View File
@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
h1{
color: rgb(12, 110, 221);
}
</style>
</head>
<body>
<h1>Holee {{$user->name}}</h1>
<p>Este es un ejemplo</p>
</body>
</html>
@@ -91,6 +91,10 @@
@can('concepto.index') @can('concepto.index')
<a class="collapse-item" href="{{ route('concepto.index') }}" style="color:#85888e">Conceptos</a> <a class="collapse-item" href="{{ route('concepto.index') }}" style="color:#85888e">Conceptos</a>
@endcan @endcan
@can('mail.index')
<a class="collapse-item" href="{{ route('mail.index') }}" style="color:#85888e">Mail</a>
@endcan
</div> </div>
</div> </div>
</li> </li>
+99
View File
@@ -0,0 +1,99 @@
@extends('layouts.landing')
@section('title',"Crear")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Crear Usuario</h6>
<a href="{{route('user.index')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Regresar</a>
</div>
</div>
<div class="card-body">
<form action="{{route('user.store')}}" method="POST">
@csrf
<div class="mb-3">
<label class="small mb-1">Nombre</label>
<input class="form-control" name="name">
</div>
<div class="mb-3">
<label class="small mb-1">Correo</label>
<input class="form-control" name="email">
</div>
<div class="mb-3">
<label class="small mb-1">Telefono</label>
<input class="form-control" name="telefono" type="number">
</div>
<div class="mb-3">
<label class="small mb-1">Dirección</label>
<input class="form-control" name="direccion">
</div>
<div class="mb-3">
<label class="small mb-1">Contraseña</label>
<input class="form-control" name="password">
</div>
<div class="mb-3">
@foreach ($plantels as $plantel)
<div class="form-check">
<input type="checkbox" class="form-check-input cb"
id="p-{{ $plantel->id }}"
name="plantels[]" value="{{ $plantel->id }}"
>
<label class="form-check-label" for="p-{{ $plantel->id }}">
{{ $plantel->name }}
</label>
</div>
@endforeach
</div>
<div class="mb-3">
<label class="small mb-1">Roles</label>
@foreach ($roles as $role)
<div class="form-check">
<input type="checkbox" class="form-check-input cb"
id="r-{{ $role->id }}"
name="roles[]" value="{{ $role->id }}">
<label class="form-check-label" for="r-{{ $role->id }}">
{{ $role->name }}
</label>
</div>
@endforeach
</div>
<div class="mb-3">
<label for="status">Seleccionar código</label>
<select class="form-control" name="codigo" id="codigo">
<option value="0">Selecciona un código....</option>
@foreach ($codigos as $codigo)
<option value="{{ $codigo->id }}">{{ $codigo->name}}</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar status</label>
<select class="form-control" name="status" id="status">
<option value="1">Activo</option>
<option value="0">Inactivo</option>
</select>
</div>
<input class="btn btn-primary" type="submit" value="Crear">
</form>
</div>
</div>
</div>
@endsection
+102
View File
@@ -0,0 +1,102 @@
@extends('layouts.landing')
@section('title',"Edit")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Editar Usuario</h6>
<a href="{{route('user.index')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Regresar</a>
</div>
</div>
<div class="card-body">
@if (session('info'))
<div class="alert alert-success">
<strong>{{session('info')}}</strong>
</div>
@endif
<form action="{{route('user.update',$user->id)}}" method="POST">
@method('PUT')
@csrf
<div class="mb-3">
<label class="small mb-1">Nombre</label>
<input class="form-control" name="name" value="{{$user->name}}">
</div>
<div class="mb-3">
<label class="small mb-1">Correo</label>
<input class="form-control" name="email" value="{{$user->email}}">
</div>
<div class="mb-3">
<label class="small mb-1">Telefono</label>
<input class="form-control" name="telefono" type="number" value="{{$user->telefono}}">
</div>
<div class="mb-3">
<label class="small mb-1">Dirección</label>
<input class="form-control" name="direccion" value="{{$user->direccion}}">
</div>
<div class="mb-3">
<label for="plantels[]">Seleccionar campus</label>
@foreach ($plantels as $plantel)
<div class="form-check">
<input type="checkbox" class="form-check-input cb"
id="p-{{ $plantel->id }}"
name="plantels[]" value="{{ $plantel->id }}"
{{ $user->existe($plantel->id) ? 'checked' : '' }}
>
<label class="form-check-label" for="p-{{ $plantel->id }}">
{{ $plantel->name }}
</label>
</div>
@endforeach
</div>
<div class="mb-3">
<label class="small mb-1" for="roles[]">Roles</label>
@foreach ($roles as $role)
<div class="form-check">
<input type="checkbox" class="form-check-input cb"
id="r-{{ $role->id }}"
name="roles[]" value="{{ $role->id }}"
{{ $user->hasRole($role->id) ? 'checked' : '' }}>
<label class="form-check-label" for="r-{{ $role->id }}">
{{ $role->name }}
</label>
</div>
@endforeach
</div>
<div class="mb-3">
<label for="status">Seleccionar código</label>
<select class="form-control" name="code" id="code" value="{{ $user->code }}">
<option value="0">Selecciona un código....</option>
@foreach ($codigos as $codigo)
<option value="{{ $codigo->id }}" {{ $user->code == $codigo->id ? 'selected' : '' }}>{{ $codigo->name}}</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="status">Seleccionar status</label>
<select class="form-control" name="status" id="status" value="{{ $user->status }}">
<option value="1" {{ $user->status=='1' ? 'selected' : '' }}>Activo</option>
<option value="0" {{ $user->status=='0' ? 'selected' : '' }}>Inactivo</option>
</select>
</div>
<input class="btn btn-primary" type="submit" value="Update">
</form>
</div>
</div>
</div>
@endsection
+83
View File
@@ -0,0 +1,83 @@
@extends('layouts.landing')
@section('head')
@include('layouts._partials.tablaStyle')
@endsection
@section('title',"Inicio")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Usuarios</h6>
</div>
</div>
<div class="card-body">
<div class="container-fluid">
<table id="tcont" class="table table-striped table-bordered nowrap table-hover" style="width:100%;">
<thead>
<tr>
<th>Id</th>
<th>Nombre</th>
<th>Rol</th>
<th>Correo</th>
<th>Status</th>
<th>Opciones</th>
</tr>
</thead>
<tbody>
@forelse ($users as $user)
<tr style="width:100%">
<td>{{$user->id}}</td>
<td><a href="{{route('user.show',$user->id)}}">{{$user->name}}</a></td>
<td>
@forelse($user->roles as $rol)
<span class="badge bg-primary text-white">
{{ $rol->name }}
</span>
@empty
<span class="text-muted">Sin rol</span>
@endforelse
</td>
<td>{{$user->email}}</td>
<td>
@if ($user->status==1)
<i class="fa-solid fa-circle" style="color: #63E6BE;"></i>
@else
<i class="fa-solid fa-circle" style="color: #e66565;"></i>
@endif
</td>
<td class="row mx-auto">
@can('user.edit')
<div class="col-sm-6 col-md-6"><a class="btn btn-primary" href="{{route('mailme',$user->id)}}">Enviar email</a></div>
@endcan
</td>
</tr>
@empty
<p>Sin usuarios.</p>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
</div>
@endsection
@section('scripts')
@include('layouts._partials.tablaScript')
@include('layouts._partials.delete')
@endsection
+36
View File
@@ -0,0 +1,36 @@
@extends('layouts.landing')
@section('title',"show")
@section('content')
<div class="container-fluid">
<div class="card shadow mb-4">
<div class="card-header py-3">
<div class="d-sm-flex align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">Datos usuario</h6>
<a href="{{route('user.index')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Regresar</a>
</div>
</div>
<div class="card-body">
<h1>{{$user->name}}</h1>
<p>{{$user->email}}</p>
{{-- <p>Nota: {{$user->note->title}}</p>
<p>Descripción: {{$user->note->description}}</p> --}}
@forelse ($user->notes as $note)
<p>Nota: {{$note->title}}</p>
<p>Descripción: {{$note->description}}</p>
<br>
@empty
@endforelse
</div>
</div>
</div>
@endsection
+3
View File
@@ -18,6 +18,7 @@ use App\Http\Controllers\CodeController;
use App\Http\Controllers\PlantelController; use App\Http\Controllers\PlantelController;
use App\Http\Controllers\ConceptoController; use App\Http\Controllers\ConceptoController;
use App\Http\Controllers\DurationController; use App\Http\Controllers\DurationController;
use App\Http\Controllers\MailController;
use App\Http\Controllers\MaterialController; use App\Http\Controllers\MaterialController;
use App\Http\Controllers\ProspectoController; use App\Http\Controllers\ProspectoController;
use App\Http\Controllers\PermissionController; use App\Http\Controllers\PermissionController;
@@ -56,5 +57,7 @@ Route::middleware(['auth:sanctum',config('jetstream.auth_session'),'verified',
Route::resource('/role',RoleController::class); Route::resource('/role',RoleController::class);
Route::resource('/turno',TurnoController::class); Route::resource('/turno',TurnoController::class);
Route::resource('/user',UserController::class); Route::resource('/user',UserController::class);
Route::resource('/mail',MailController::class);
Route::get('/mailme/{user}',[MailController::class,'mailme'])->name('mailme');
}); });