creation and implementation of the crud model for users and start of the pending_users DB

This commit is contained in:
ygbanzato 2023-05-02 12:27:53 +01:00
parent 1da54d43f4
commit c387eae375
11 changed files with 632 additions and 105 deletions

View File

@ -17,6 +17,12 @@
class userController extends Controller
{
public function UserProfile (){
}
public function authenticate(Request $request)
{
@ -34,4 +40,82 @@ public function authenticate(Request $request)
return null;
}
public function ListUsers()
{
$users = User::all();
return view('Admin.CrudUsers.listUsers', compact('users'));
}
public function show($id)
{
$user = User::findOrFail($id);
return view('Admin.CrudUsers.showUsers', compact('user'));
}
public function edit($id)
{
$user = User::findOrFail($id);
return view('Admin.CrudUsers.editUsers', compact('user'));
}
public function update(Request $request, User $user)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users,email,' . $user->id,
'password' => 'nullable|min:8|confirmed',
'user_type' => 'required',
'user_phone' => 'required',
'user_nif' => 'required',
]);
$user->update([
'name' => $request->get('name'),
'email' => $request->get('email'),
'password' => $request->filled('password') ? Hash::make($request->get('password')) : $user->password,
'user_type' => $request->get('user_type'),
'user_phone' => $request->get('user_phone'),
'user_nif' => $request->get('user_nif'),
]);
return redirect('/users/ListUsers')->with('success', 'Usuario atualizado com Sucesso!!');
}
public function create()
{
return view('users.create');
}
public function store(Request $request)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
'user_type' => 'required',
'user_phone' => 'required',
'user_nif' => 'required',
]);
$user = new User([
'name' => $request->get('name'),
'email' => $request->get('email'),
'password' => Hash::make($request->get('password')),
'user_type' => $request->get('user_type'),
'user_phone' => $request->get('user_phone'),
'user_nif' => $request->get('user_nif'),
]);
$user->save();
return redirect('/users')->with('success', 'User created successfully!');
}
public function destroy(User $user)
{
$user->delete();
return redirect('/users/ListUsers')->with('success', 'User deleted successfully!');
}
}

View File

@ -15,7 +15,7 @@ class CheckSuperAdmin
*/
public function handle(Request $request, Closure $next): Response
{
if (auth()->user() && auth()->user()->user_type == 'Super_Admin') {
if (auth()->user() && auth()->user()->user_type == 'Super_Administrador') {
return $next($request);
}

View File

@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class pending_user extends Model
{
use HasFactory;
}

View File

@ -0,0 +1 @@
<h1>CRUD USERS</h1>

View File

@ -0,0 +1,116 @@
@extends('Templates/templateAdmin')
@section('content-wrapper')
<div class="content-wrapper">
<section class="content">
<div class="container-fluid">
{{-- <h1>Editar dados do {{$user->name }}</h1>
<div class="card">
<div class="card-header">
Detalhes do usuário :: {{ $user->name }}</div>
<div class="card-body">
<div class="row">
<div class="col-sm">
<input type="text">
</div>
<div class="col-sm">
<input type="text">
</div>
</div>
</div>
<div class="row">
<div class="col-sm">
</div>
<div class="col-sm">
<button class="btn btn-primary">Editar</button>
</div>
</div>
</div> --}}
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">Editar Usuário</div>
<div class="card-body">
<form action="{{ route('users.update', $user->id) }}" method="POST">
@csrf
@method('PUT')
<div class="form-group">
<label for="name">Nome:</label>
<input type="text" class="form-control" id="name" name="name" value="{{ $user->name }}" required>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="email" class="form-control" id="email" name="email" value="{{ $user->email }}" required>
</div>
<div class="form-group">
<label for="password">Senha:</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Deixe em branco para não alterar">
</div>
<div class="form-group">
<label for="password_confirmation">Confirme a senha:</label>
<input type="password" class="form-control" id="password_confirmation" name="password_confirmation">
</div>
<div class="form-group">
<label for="user_type">Tipo de Usuário:</label>
<select class="form-control" id="user_type" name="user_type" required>
<option value="Super_Administrador" {{ $user->user_type == 'Super_Administrador' ? 'selected' : '' }}>Super Administrador</option>
<option value="Administrador" {{ $user->user_type == 'Administrador' ? 'selected' : '' }}>Administrador</option>
<option value="Utilizador" {{ $user->user_type == 'Utilizador' ? 'selected' : '' }}>Utilizador</option>
</select>
</div>
<div class="form-group">
<label for="user_phone">Telemóvel:</label>
<input type="text" class="form-control" id="user_phone" name="user_phone" value="{{ $user->user_phone }}" required>
</div>
<div class="form-group">
<label for="user_nif">NIF:</label>
<input type="text" class="form-control" id="user_nif" name="user_nif" value="{{ $user->user_nif }}" required>
</div>
<button type="submit" class="btn btn-primary">Salvar</button>
<a href="{{ route('users.list') }}" class="btn btn-secondary">Cancelar</a>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{{-- ./container-fluid --}}
</section>
{{-- /.content --}}
</div>
{{-- ./content-wrapper --}}
@endsection

View File

@ -0,0 +1,146 @@
@extends('Templates/templateAdmin')
@section('content-wrapper')
<div class="content-wrapper">
<section class="content">
<div class="container-fluid">
<h1>Algum Titulo </h1>
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<div class="card">
<div class="card-header">
<h3 class="card-title">Tabela Utilizadores</h3>
<div class="card-tools">
<div class="input-group input-group-sm" style="width: 150px;">
<input type="text" name="table_search" class="form-control float-right"
placeholder="Search">
<div class="input-group-append">
<button type="submit" class="btn btn-default">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</div>
</div>
<!-- /.card-header -->
<div class="card-body table-responsive p-0">
<table class="table table-hover text-nowrap">
<thead>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Email</th>
<th>Tipo de Usuário</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
@foreach ($users as $user)
<tr>
<td>{{ $user->id }}</td>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
<td>{{ $user->user_type }}</td>
<td class="text-center d-flex justify-content-around">
<a href="{{ route('users.Show', ['id' => $user->id]) }}">
<i class="fa-solid fa-eye text-secondary"></i>
</a>
<a href="{{ route('users.edit', ['id' => $user->id]) }}">
<i class="fa-solid fa-edit text-primary"></i>
</a>
{{-- <a href="#">
<i class="fa-solid fa-trash-alt text-danger"></i>
</a> --}}
<form action="{{ route('users.destroy', $user) }}" method="POST"
onsubmit="return confirm('Are you sure you want to delete this user?');"
style="display:inline;">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">
<i class="fa-solid fa-trash-alt text-white"></i>
</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
<div class="card">
<div class="card-header">
<h3 class="card-title">Pendentes Utilizadores</h3>
<div class="card-tools">
<div class="input-group input-group-sm" style="width: 150px;">
<input type="text" name="table_search" class="form-control float-right"
placeholder="Search">
<div class="input-group-append">
<button type="submit" class="btn btn-default">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</div>
</div>
<!-- /.card-header -->
<div class="card-body table-responsive p-0">
<table class="table table-hover text-nowrap">
<thead>
<tr>
<th>Nome</th>
<th>Email</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
@foreach ($users as $user)
<tr>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
<td class="text-center d-flex justify-content-around">
<a href="{{ route('users.Show', ['id' => $user->id]) }}">
<i class="fa-solid fa-thumbs-up text-success"></i>
</a>
<a href="{{ route('users.edit', ['id' => $user->id]) }}">
<i class="fa-solid fa-edit text-primary"></i>
</a>
{{-- <a href="#">
<i class="fa-solid fa-trash-alt text-danger"></i>
</a> --}}
<form action="{{ route('users.destroy', $user) }}" method="POST"
onsubmit="return confirm('Are you sure you want to delete this user?');"
style="display:inline;">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">
<i class="fa-solid fa-trash-alt text-white"></i>
</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!-- /.card-body -->
</div>
</div>
{{-- /.container-fluid" --}}
</section>
</div>
@endsection

View File

@ -0,0 +1,61 @@
@extends('Templates/templateAdmin')
@section('content-wrapper')
<div class="content-wrapper">
<section class="content">
<div class="container-fluid">
<h1>Detalhes de User</h1>
<div class="card">
<div class="card-header">
Detalhes do usuário :: {{ $user->name }}</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered table-striped">
<tr>
<th>ID</th>
<td>{{ $user->id }}</td>
</tr>
<tr>
<th>Nome</th>
<td>{{ $user->name }}</td>
</tr>
<tr>
<th>Email</th>
<td>{{ $user->email }}</td>
</tr>
<tr>
<th>Tipo de usuário</th>
<td>{{ $user->user_type }}</td>
</tr>
<tr>
<th>Criado em : </th>
<td>{{ $user->created_at }}</td>
</tr>
<tr>
<th>Atualizado em : </th>
<td>{{ $user->updated_at }}</td>
</tr>
</table>
</div>
</div>
<div class="row">
<div class="col-sm">
</div>
<div class="col-sm">
<a href="{{ route('users.edit', ['id' => $user->id]) }}" class="btn btn-primary">Editar usuário</a>
</div>
</div>
</div>
</div>
{{-- /.container-fluid --}}
</section>
{{-- /.content --}}
</div>
{{-- /.content-wrapper --}}
@endsection

View File

@ -1,4 +1,3 @@
@extends('Templates/templateAdmin')
@section('content-wrapper')
@ -248,6 +247,7 @@
</div>
</div>
</div>
{{-- /.container-fluid --}}
</section>
<!-- /.content -->
</div>

View File

@ -0,0 +1,100 @@
@extends('Templates/templateAdmin')
@section('content-wrapper')
<div class="content-wrapper">
<section class="content">
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-md-12">
<!-- Card box User Profile -->
<div class="card card-primary">
<div class="card-body">
<div class="row align-items-center">
<div class="col-sm">
<div class="user-panel mt-3 pb-3 mb-3">
<div class="image d-flex justify-content-center align-items-center">
<label for="input-file" class="imgProfile-hover">
<img src="{{ asset('/img/avatar5.png') }}"
class="img-circle elevation-2 imgProfile" alt="User Image">
{{-- Parte de baixo para colocar o 'Escolher arquivo' --}}
{{-- <div class="input-group input-file">
<input type="text" class="form-control"
placeholder="Escolha um arquivo" readonly>
<span class="input-group-btn">
<button class="btn btn-secondary btn-choose"
type="button">Escolher arquivo</button>
</span>
</div> --}}
</label>
{{-- <input type="file" id="input-file" class="d-none"> --}}
</div>
</div>
<div class="info text-center">
{{-- <p class="d-block" style="font-size: 2rem;">{{ $tipo_usuario }}</p> --}}
</div>
</div>
<div class="col-sm">
<div class="row">
<div class="col-sm form-group align-self-center">
<p>Nome: <input class="form-control" type="text" name=""></p>
</div>
<div class="col-sm form-group align-self-center">
<p>Email: <input class="form-control" type="text" name=""></p>
</div>
</div>
<div class="row">
<div class="col-sm form-group align-self-center">
<p>Telemovel: <input class="form-control" type="text" name=""></p>
</div>
<div class="col-sm form-group align-self-center">
<p>NIF: <input class="form-control" type="text" name=""></p>
</div>
</div>
<div class="row">
<div class="col-sm form-group align-self-center">
{{-- <p>Nova Senha: <input class="form-control" type="text" name=""></p> --}}
</div>
<div class="col-sm form-group align-self-center">
<a href="" class="btn btn-primary">Redefinir Senha</a>
</div>
</div>
</div>
</div>
</div>
<!-- /.card-body -->
<div class="card-footer">
<div class="float-right">
<button type="submit" class="btn btn-primary">Guardar</button>
</div>
</div>
</div>
<!-- /.card -->
</div>
</div>
</div>
{{-- ./container-fluid" --}}
</section>
{{-- ./content --}}
</div>
{{-- ./content-wrapper --}}
@endsection

View File

@ -69,12 +69,13 @@ class="fas fa-bars"></i></a>
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="index3.html" class="brand-link">
<a href="#" class="brand-link" style="pointer-events: none;">
<img src="{{ asset('/img/ispt.jpg') }}" alt="AdminLTE Logo" class="brand-image img-circle elevation-3"
style="opacity: .8">
<span class="brand-text font-weight-light">ISPT 4.0</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user panel (optional) -->
@ -85,14 +86,14 @@ class="fas fa-bars"></i></a>
</div>
<div class="info">
@if (Auth::check())
<a href="{{ 'user' }}" class="d-block">{{ Auth::user()->user_type }}
<a href="{{ 'usersProfiles' }}" class="d-block">{{ Auth::user()->user_type }}
</a>
@endif
</div>
</div>
<!-- SidebarSearch Form -->
<div class="form-inline">
{{-- <div class="form-inline">
<div class="input-group" data-widget="sidebar-search">
<input class="form-control form-control-sidebar" type="search" placeholder="Procurar"
aria-label="search">
@ -102,7 +103,7 @@ class="fas fa-bars"></i></a>
</button>
</div>
</div>
</div>
</div> --}}
<!-- Sidebar Menu -->
<nav class="mt-2">
@ -111,80 +112,38 @@ class="fas fa-bars"></i></a>
<!-- Add icons to the links using the .nav-icon class
with font-awesome or any other icon font library -->
<li class="nav-item">
<a href="dashboard.html" class="nav-link active">
<a href="{{route('home')}}" class="nav-link active">
<i class="nav-icon fas fa-tachometer-alt"></i>
<p>
Dashboard
</p>
<p> Dashboard </p>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-helmet-safety"></i>
<p> Criar obra </p>
</a>
</li>
{{-- <li class="nav-item">
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit" class="nav-link active">Logout</button>
</form>
{{-- <a href="{{route('logout')}}" class="nav-link active">
<i class="nav-icon fas fa-tachometer-alt"></i>
<p>
Logout
</p>
</a> --}}
</li>
</li> --}}
<li class="nav-item">
<a href="{{ route('formulario') }}" class="nav-link active">
<i class="nav-icon fas fa-tachometer-alt"></i>
<p>
Criar Utilizadores
</p>
</a>
</li>
<li class="nav-item">
{{-- <li class="nav-item">
<a href="{{ route('test') }}" class="nav-link active">
<i class="nav-icon fas fa-tachometer-alt"></i>
<p>
TestController
</p>
</a>
</li>
</li> --}}
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-helmet-safety"></i>
<p>
Obras
<i class="fas fa-angle-left right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="planeamento.html" class="nav-link">
<i class="fa-solid fa-file-edit"></i>
<p>Em planeamento</p>
</a>
</li>
<li class="nav-item">
<a href="preparadas.html" class="nav-link">
<i class="fa-solid fa-file"></i>
<p>Preparadas</p>
</a>
</li>
<li class="nav-item">
<a href="execucao.html" class="nav-link">
<i class="fas fa-file-alt"></i>
<p>Em execução</p>
</a>
</li>
<li class="nav-item">
<a href="concluidas.html" class="nav-link">
<i class="fas fa-check-circle"></i>
<p>Concluídas</p>
</a>
</li>
</ul>
</li>
<!-- /.Multiple menu item -->
<li class="nav-item">
@ -197,18 +156,29 @@ class="fas fa-bars"></i></a>
</li>
<li class="nav-item">
<a href="criar-ativos.html" class="nav-link">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-briefcase"></i>
<p>
Portefólio
<p> Portefólio
<i class="fas fa-angle-left right"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="criar-ativos.html" class="nav-link">
<a href="utilizadores.html" class="nav-link">
<i class="fa-solid fa-file-edit"></i>
<p>Gerir Ativos</p>
<p> Gerir Ativos</p>
</a>
</li>
<li class="nav-item">
<a href="{{route('users.list')}}" class="nav-link">
<i class="fa-solid fa-file-edit"></i>
<p> Gerir Utilizadores</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('formulario') }}" class="nav-link">
<i class="nav-icon fas fa-tachometer-alt"></i>
<p> Criar Utilizadores </p>
</a>
</li>
</ul>
@ -218,8 +188,7 @@ class="fas fa-bars"></i></a>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-gear"></i>
<p>
Administração
<p> Administração
<i class="fas fa-angle-left right"></i>
</p>
</a>
@ -238,6 +207,7 @@ class="fas fa-bars"></i></a>
</li>
</ul>
</li>
<!-- /.Single menu item -->
</ul>
</nav>

View File

@ -20,6 +20,10 @@
use App\Http\Controllers\Auth\RegisteredUserController;
/*
|--------------------------------------------------------------------------
| Web Routes
@ -35,7 +39,7 @@
// Rotas protegidas que exigem verificação de e-mail
Route::get('/', function () {
return view('Admin/index');
});
})->name('home');
Route::get('formulario', function () {
return view('email/formAdmin');
@ -43,24 +47,83 @@
});
/*
|--------------------------------------------------------------------------
| User_Type (Super_Administrador)
|--------------------------------------------------------------------------
|*** Routes unique access to the Super_Administrator, due to its sensitive data.
|
|
*/
Route::middleware(['auth', 'verified', 'checksuperadmin'])->group(function () {
// Rotas protegidas que exigem verificação de e-mail e user_type Super_Admin
Route::get('/register', [RegisteredUserController::class, 'create'])
->name('register');
Route::post('/register', [RegisteredUserController::class, 'store']);
Route::get('formulario', function () {
return view('email/formAdmin');
})->name('formulario');
Route::get('usersProfiles', [userController::class, 'UserProfile'] )-> name('usersProfiles');
// Rota responsavel por enviar o formulario
Route::post('enviar-formulario', [FormController::class, 'enviarEmail'])->name('enviar.formulario');
Route::get('/CreateUser', function () {
return view('Admin/createUser');
});
/*
|--------------------------------------------------------------------------
| CRUD - users
|--------------------------------------------------------------------------
|
| Definition routes to implement the CRUD model
|
*/
Route::get('users/ListUsers', [userController::class, 'ListUsers'])->name('users.list');
});
Route::get('users/{id}', [userController::class, 'show'])->name('users.Show');
Route::get('users/{id}/edit',[userController::class, 'edit'])->name('users.edit');
Route::put('users/{user}', [userController::class, 'update'])->name('users.update');
Route::delete('users/{user}', [UserController::class, 'destroy'])->name('users.destroy');
Route::get('userProfile', function (){
return view('Admin/profile');
});
// Rota responsavel por enviar o formulario
Route::post('enviar-formulario', [FormController::class, 'enviarEmail'])->name('enviar.formulario');
Route::get('/test-email', function () {
$to = 'ygbanzato@isptgroup.com';
$subject = 'Test Email from Laravel';
Route::get('/CreateUser', function(){
return view('email/createUser');
$message = Mail::raw('This is a test email from Laravel.', function ($message) use ($to, $subject) {
$message->to($to)->subject($subject);
});
if ($message) {
return 'Email sent successfully';
} else {
return 'Failed to send email';
}
});
Route::get('test', [userController::class,'test'])->name('test');
// Route::get('/forgot-password', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request');
// Route::post('/forgot-password', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email');
// Route::get('/reset-password/{token}', [ResetPasswordController::class, 'showResetForm'])->name('password.reset');
// Route::post('/reset-password', [ResetPasswordController::class, 'reset'])->name('password.update')
// Route::post('/reset-password', [ResetPasswordController::class, 'reset'])->name('password.update');
@ -90,28 +153,3 @@
// return back()->with('status', 'verification-link-sent');
// })->middleware(['auth', 'throttle:6,1'])->name('verification.send');
Route::get('/test-email', function () {
$to = 'vzx1red@gmail.com';
$subject = 'Test Email from Laravel';
$message = Mail::raw('This is a test email from Laravel.', function ($message) use ($to, $subject) {
$message->to($to)->subject($subject);
});
if ($message) {
return 'Email sent successfully';
} else {
return 'Failed to send email';
}
});
// Route::get('/forgot-password', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request');
// Route::post('/forgot-password', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email');
// Route::get('/reset-password/{token}', [ResetPasswordController::class, 'showResetForm'])->name('password.reset');
// Route::post('/reset-password', [ResetPasswordController::class, 'reset'])->name('password.update')