abm usuarios

This commit is contained in:
cmoreno 2026-10-12 11:02:51 -03:00
parent e1f55e0ede
commit 766f8c24da
6 changed files with 467 additions and 0 deletions

View File

@ -0,0 +1,106 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class UsuarioController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
$usuarios = User::all();
return view('usuarios.index', compact('usuarios'));
}
public function create()
{
return view('usuarios.create');
}
public function store(Request $request)
{
$datos = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|max:255|unique:users,email',
'password' => 'required|string|min:8|confirmed',
]);
$usuario = new User();
$usuario->fill([
'name' => $datos['name'],
'email' => $datos['email'],
'password' => $datos['password'],
]);
$usuario->save();
return redirect()->route('usuarios.index')
->with('mensaje-success', 'Usuario registrado correctamente');
}
public function show($id)
{
$usuario = User::findOrFail($id);
return view('usuarios.show', compact('usuario'));
}
public function edit($id)
{
$usuario = User::findOrFail($id);
return view('usuarios.edit', compact('usuario'));
}
public function update(Request $request, $id)
{
$usuario = User::findOrFail($id);
$datos = $request->validate([
'name' => 'required|string|max:255',
'email' => [
'required',
'email',
'max:255',
Rule::unique('users', 'email')->ignore($usuario->id),
],
'password' => 'nullable|string|min:8|confirmed',
]);
$usuario->name = $datos['name'];
$usuario->email = $datos['email'];
if (!empty($datos['password'])) {
$usuario->password = $datos['password'];
}
$usuario->update();
return redirect()->route('usuarios.index')
->with('mensaje-success', 'Usuario actualizado correctamente');
}
public function destroy($id)
{
$usuario = User::findOrFail($id);
if ($usuario->id == auth()->id()) {
return redirect()->route('usuarios.index')
->with('mensaje-error', 'No puede eliminar su propio usuario');
}
$usuario->delete();
return redirect()->route('usuarios.index')
->with('mensaje-success', 'Usuario eliminado correctamente');
}
}

View File

@ -0,0 +1,97 @@
@extends('layouts.admin')
@section('contenido')
<div class="row justify-content-center align-items-center">
<div class="col-lg-11 col-md-11">
<h3>Nuevo Usuario</h3>
</div>
</div>
<div class="row">
<div class="col-md-10">
@include('compartido.mensajes')
@include('compartido.errores')
</div>
</div>
<br>
<form method="POST" action="{{ route('usuarios.store') }}">
@csrf
<div class="row">
<div class="form-group col-md-4">
<label for="name">Nombre (*)</label>
<input type="text"
name="name"
id="name"
value="{{ old('name') }}"
class="form-control"
required>
</div>
<div class="form-group col-md-4">
<label for="email">Correo electrónico (*)</label>
<input type="email"
name="email"
id="email"
value="{{ old('email') }}"
class="form-control"
required>
</div>
</div>
<div class="row">
<div class="form-group col-md-4">
<label for="password">Contraseña (*)</label>
<input type="password"
name="password"
id="password"
class="form-control"
required>
</div>
<div class="form-group col-md-4">
<label for="password_confirmation">
Confirmar contraseña (*)
</label>
<input type="password"
name="password_confirmation"
id="password_confirmation"
class="form-control"
required>
</div>
</div>
<br>
<div class="row justify-content-center align-items-center">
<div class="col-md-2">
<button type="submit"
class="btn btn-success btn-block btn-lg">
Guardar
</button>
</div>
<div class="col-md-2">
<a href="{{ route('usuarios.index') }}"
class="btn btn-primary btn-block btn-lg">
Salir
</a>
</div>
</div>
</form>
@endsection

View File

@ -0,0 +1,104 @@
@extends('layouts.admin')
@section('contenido')
<div class="row justify-content-center align-items-center">
<div class="col-lg-11 col-md-11">
<h3>Editar Usuario</h3>
</div>
</div>
<div class="row">
<div class="col-md-10">
@include('compartido.mensajes')
@include('compartido.errores')
</div>
</div>
<br>
<form method="POST"
action="{{ route('usuarios.update', $usuario->id) }}">
@csrf
@method('PUT')
<div class="row">
<div class="form-group col-md-4">
<label for="name">Nombre (*)</label>
<input type="text"
name="name"
id="name"
value="{{ old('name', $usuario->name) }}"
class="form-control"
required>
</div>
<div class="form-group col-md-4">
<label for="email">Correo electrónico (*)</label>
<input type="email"
name="email"
id="email"
value="{{ old('email', $usuario->email) }}"
class="form-control"
required>
</div>
</div>
<div class="row">
<div class="form-group col-md-4">
<label for="password">
Nueva contraseña (opcional)
</label>
<input type="password"
name="password"
id="password"
class="form-control">
</div>
<div class="form-group col-md-4">
<label for="password_confirmation">
Confirmar nueva contraseña
</label>
<input type="password"
name="password_confirmation"
id="password_confirmation"
class="form-control">
</div>
</div>
<p class="text-muted">
Deje los campos de contraseña vacíos si no desea modificarla.
</p>
<br>
<div class="row justify-content-center align-items-center">
<div class="col-md-2">
<button type="submit"
class="btn btn-success btn-block btn-lg">
Actualizar
</button>
</div>
<div class="col-md-2">
<a href="{{ route('usuarios.index') }}"
class="btn btn-primary btn-block btn-lg">
Salir
</a>
</div>
</div>
</form>
@endsection

View File

@ -0,0 +1,100 @@
@extends('layouts.admin')
@section('contenido')
<div class="row justify-content-center align-items-center">
<div class="col-12 col-md-11">
<h3>Listado de Usuarios</h3>
</div>
</div>
<div class="row justify-content-center align-items-center">
<div class="col-md-2">
<a href="{{ route('usuarios.create') }}"
class="btn btn-success btn-block btn-lg">
Nuevo
</a>
</div>
</div>
<br>
<div class="row justify-content-center align-items-center">
<div class="col-12 col-md-11">
@include('compartido.mensajes')
@include('compartido.errores')
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover"
id="example">
<thead>
<tr>
<th>Id</th>
<th>Nombre</th>
<th>Email</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
@foreach($usuarios as $usuario)
<tr>
<td>{{ $usuario->id }}</td>
<td>{{ $usuario->name }}</td>
<td>{{ $usuario->email }}</td>
<td align="center">
<a class="btn btn-info"
href="{{ route('usuarios.show', $usuario->id) }}"
title="Ver">
<i class="fa fa-eye"></i>
</a>
<a class="btn btn-warning"
href="{{ route('usuarios.edit', $usuario->id) }}"
title="Editar">
<i class="fa fa-pencil"></i>
</a>
<form method="POST"
action="{{ route('usuarios.destroy', $usuario->id) }}"
style="display:inline;">
@csrf
@method('DELETE')
<button type="submit"
class="btn btn-danger"
onclick="return confirm('¿Está seguro de eliminar el usuario?');"
title="Eliminar">
<i class="fa fa-remove"></i>
</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
@endsection
@push('scripts')
<script>
$('#example').DataTable({
dom: 'Bfrtip',
buttons: ['excel'],
pageLength: 5
});
</script>
@endpush

View File

@ -0,0 +1,56 @@
@extends('layouts.admin')
@section('contenido')
<div class="row justify-content-center align-items-center">
<div class="col-md-10">
<h3>Detalle del Usuario</h3>
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-md-4">
<strong>ID:</strong>
{{ $usuario->id }}
</div>
<div class="col-md-4">
<strong>Nombre:</strong>
{{ $usuario->name }}
</div>
<div class="col-md-4">
<strong>Correo electrónico:</strong>
{{ $usuario->email }}
</div>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-md-2">
<a href="{{ route('usuarios.edit', $usuario->id) }}"
class="btn btn-warning btn-block">
Editar
</a>
</div>
<div class="col-md-2">
<a href="{{ route('usuarios.index') }}"
class="btn btn-primary btn-block">
Salir
</a>
</div>
</div>
</div>
</div>
@endsection

View File

@ -3,6 +3,8 @@
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CategoriasController; use App\Http\Controllers\CategoriasController;
use App\Http\Controllers\ProductoController; use App\Http\Controllers\ProductoController;
use App\Http\Controllers\UsuarioController;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Web Routes | Web Routes
@ -32,4 +34,6 @@ Route::resource('categorias', CategoriasController::class)->middleware('auth');
Route::resource('productos', ProductoController::class); Route::resource('productos', ProductoController::class);
Route::put('categorias/restaurar/{categoria}', [CategoriasController::class, 'restaurar'])->name('categorias.restaurar')->middleware('auth'); Route::put('categorias/restaurar/{categoria}', [CategoriasController::class, 'restaurar'])->name('categorias.restaurar')->middleware('auth');
Auth::routes(); Auth::routes();
Route::resource('usuarios', UsuarioController::class)
->middleware('auth');
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');