se anexa token de api de google maps para rastreo de ubicaciones
This commit is contained in:
@@ -9,7 +9,7 @@ use Illuminate\Support\Facades\Auth;
|
|||||||
class CodeController extends Controller
|
class CodeController extends Controller
|
||||||
{
|
{
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
$this->middleware('can:code.index')->only('index','show','create');
|
$this->middleware('can:asistencia')->only('index','show','create');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function index()
|
public function index()
|
||||||
@@ -23,8 +23,17 @@ class CodeController extends Controller
|
|||||||
return view('code.index',compact('codes','registros'));
|
return view('code.index',compact('codes','registros'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function show()
|
public function registros()
|
||||||
{
|
{
|
||||||
return view('code.show');
|
$user = Auth::user();
|
||||||
|
|
||||||
|
$codes = Code::where('user_id', $user->id)
|
||||||
|
->orderBy('registro', 'desc')
|
||||||
|
->get()
|
||||||
|
->groupBy(function ($code) {
|
||||||
|
return $code->registro->format('Y-m-d');
|
||||||
|
});
|
||||||
|
|
||||||
|
return view('code.show',compact('codes'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class HorarioController extends Controller
|
|||||||
$this->middleware('can:horario.edit')->only('edit','update');
|
$this->middleware('can:horario.edit')->only('edit','update');
|
||||||
$this->middleware('can:horario.destroy')->only('destroy');
|
$this->middleware('can:horario.destroy')->only('destroy');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$usuarios = User::with(['roles'])->has('horarios')->get();
|
$usuarios = User::with(['roles'])->has('horarios')->get();
|
||||||
@@ -26,7 +27,10 @@ class HorarioController extends Controller
|
|||||||
|
|
||||||
public function create()
|
public function create()
|
||||||
{
|
{
|
||||||
$usuarios = User::where('code','!=','0')->get();
|
$usuarios = User::with(['roles'])
|
||||||
|
->where('code', '!=', '0')
|
||||||
|
->doesntHave('horarios')
|
||||||
|
->get();;
|
||||||
|
|
||||||
$inicioSemana = Carbon::now()->startOfWeek();
|
$inicioSemana = Carbon::now()->startOfWeek();
|
||||||
|
|
||||||
@@ -80,7 +84,6 @@ class HorarioController extends Controller
|
|||||||
return view('horario.edit', compact('user','usuarios','dias','horarios'));
|
return view('horario.edit', compact('user','usuarios','dias','horarios'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function update(Request $request, User $user)
|
public function update(Request $request, User $user)
|
||||||
{
|
{
|
||||||
foreach ($request->horarios as $h) {
|
foreach ($request->horarios as $h) {
|
||||||
@@ -111,14 +114,15 @@ class HorarioController extends Controller
|
|||||||
return view('horario.show',compact('areacode'));
|
return view('horario.show',compact('areacode'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroy(Horario $horario)
|
public function destroy(User $user)
|
||||||
{
|
{
|
||||||
// $areacode->delete();
|
$user->horarios()->delete();
|
||||||
// session()->flash('swal',[
|
session()->flash('swal',[
|
||||||
// 'icon'=>'success',
|
'icon'=>'success',
|
||||||
// 'title'=>'Eliminado!',
|
'title'=>'Eliminado!',
|
||||||
// 'text'=>'Se ha eliminado el registro correctamente'
|
'text'=>'Se han eliminado los registros correctamente'
|
||||||
// ]);
|
]);
|
||||||
// return redirect()->route('horario.index');
|
return redirect()->route('horario.index');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,4 +41,8 @@ return [
|
|||||||
'webhook_secret' => env('STRIPE_WEBHOOK_SECRET'),
|
'webhook_secret' => env('STRIPE_WEBHOOK_SECRET'),
|
||||||
],
|
],
|
||||||
|
|
||||||
|
'google_maps' => [
|
||||||
|
'key' => env('GOOGLE_MAPS_API_KEY'),
|
||||||
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -6,20 +6,16 @@ use Illuminate\Support\Facades\Schema;
|
|||||||
|
|
||||||
return new class extends Migration
|
return new class extends Migration
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Run the migrations.
|
|
||||||
*/
|
|
||||||
public function up(): void
|
public function up(): void
|
||||||
{
|
{
|
||||||
Schema::create('incidencias', function (Blueprint $table) {
|
Schema::create('incidencias', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
|
$table->string('user_id');
|
||||||
$table->dateTime('dia');
|
$table->dateTime('dia');
|
||||||
|
$table->string('description');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Reverse the migrations.
|
|
||||||
*/
|
|
||||||
public function down(): void
|
public function down(): void
|
||||||
{
|
{
|
||||||
Schema::dropIfExists('incidencias');
|
Schema::dropIfExists('incidencias');
|
||||||
|
|||||||
@@ -108,13 +108,7 @@ class RoleSeeder extends Seeder
|
|||||||
Permission::create(['name'=>'areacode.edit','description'=>'Editar códigos qr'])->syncRoles([$role1]);
|
Permission::create(['name'=>'areacode.edit','description'=>'Editar códigos qr'])->syncRoles([$role1]);
|
||||||
Permission::create(['name'=>'areacode.destroy','description'=>'Eliminar códigos qr'])->syncRoles([$role1]);
|
Permission::create(['name'=>'areacode.destroy','description'=>'Eliminar códigos qr'])->syncRoles([$role1]);
|
||||||
|
|
||||||
Permission::create(['name'=>'code.index','description'=>'Ver asistencia digital'])->syncRoles([$role1]);
|
Permission::create(['name'=>'asistencia','description'=>'asistencia digital'])->syncRoles([$role1]);
|
||||||
Permission::create(['name'=>'code.create','description'=>'Asistencia digital'])->syncRoles([$role1]);
|
|
||||||
|
|
||||||
Permission::create(['name'=>'asistencia.index','description'=>'Ver asistencias'])->syncRoles([$role1]);
|
|
||||||
Permission::create(['name'=>'asistencia.create','description'=>'Crear 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'=>'mail.index','description'=>'Ver mail'])->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.create','description'=>'Crear mail'])->syncRoles([$role1]);
|
||||||
|
|||||||
@@ -58,9 +58,6 @@
|
|||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,197 @@
|
|||||||
|
@extends('layouts.landing')
|
||||||
|
|
||||||
|
@section('title',"show")
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<div class="container-fluid">
|
||||||
|
|
||||||
|
<div class="card shadow mb-4">
|
||||||
|
|
||||||
|
<div class="card-header py-3 d-flex justify-content-between">
|
||||||
|
<h6 class="m-0 font-weight-bold text-primary">
|
||||||
|
Datos de los registros
|
||||||
|
</h6>
|
||||||
|
|
||||||
|
<a href="{{ route('code.index') }}" class="btn btn-sm btn-primary">
|
||||||
|
Regresar
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
@foreach ($codes as $fecha => $registros)
|
||||||
|
|
||||||
|
<div class="card shadow mb-4">
|
||||||
|
|
||||||
|
<div class="card-header bg-primary text-white d-flex justify-content-between">
|
||||||
|
|
||||||
|
<h5 class="m-0">
|
||||||
|
📅 {{ \Carbon\Carbon::parse($fecha)->format('d/m/Y') }}
|
||||||
|
</h5>
|
||||||
|
|
||||||
|
<button class="btn btn-light btn-sm ver-ruta" data-registros='@json($registros)'>
|
||||||
|
<i class="fa-solid fa-circle-location-arrow fa-fade"></i>
|
||||||
|
Rastrear
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
@foreach ($registros as $registro)
|
||||||
|
|
||||||
|
<div class="{{ !$loop->last ? 'border-bottom' : '' }} mb-2 pb-2">
|
||||||
|
<strong>Hora:</strong>
|
||||||
|
{{ $registro->registro->format('h:i A') }}
|
||||||
|
<br>
|
||||||
|
<strong>Código:</strong>
|
||||||
|
{{ $registro->codigo }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="mapOverlay"
|
||||||
|
style="
|
||||||
|
position:fixed;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
background:rgba(0,0,0,.6);
|
||||||
|
z-index:9999;
|
||||||
|
display:none;
|
||||||
|
">
|
||||||
|
|
||||||
|
<div
|
||||||
|
style="
|
||||||
|
position:absolute;
|
||||||
|
top:50%;
|
||||||
|
left:50%;
|
||||||
|
transform:translate(-50%,-50%);
|
||||||
|
width:80%;
|
||||||
|
height:80%;
|
||||||
|
background:white;
|
||||||
|
border-radius:10px;
|
||||||
|
overflow:hidden;
|
||||||
|
">
|
||||||
|
|
||||||
|
<button id="cerrarMapa"
|
||||||
|
class="btn btn-danger btn-sm"
|
||||||
|
style="
|
||||||
|
position:absolute;
|
||||||
|
top:10px;
|
||||||
|
right:10px;
|
||||||
|
z-index:10;
|
||||||
|
">
|
||||||
|
✖
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div id="map"
|
||||||
|
style="width:100%;height:100%;"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
|
||||||
|
{{-- GOOGLE MAPS --}}
|
||||||
|
<script src="https://maps.googleapis.com/maps/api/js?key={{ config('services.google_maps.key') }}"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
let map;
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
|
||||||
|
const overlay =
|
||||||
|
document.getElementById('mapOverlay');
|
||||||
|
|
||||||
|
const cerrar =
|
||||||
|
document.getElementById('cerrarMapa');
|
||||||
|
|
||||||
|
cerrar.onclick = () => {
|
||||||
|
overlay.style.display = 'none';
|
||||||
|
};
|
||||||
|
|
||||||
|
document.querySelectorAll('.ver-ruta')
|
||||||
|
.forEach(btn => {
|
||||||
|
|
||||||
|
btn.addEventListener('click', function () {
|
||||||
|
|
||||||
|
console.log("CLICK OK");
|
||||||
|
|
||||||
|
const registros =
|
||||||
|
JSON.parse(this.dataset.registros);
|
||||||
|
|
||||||
|
const puntos = registros.map(r => ({
|
||||||
|
lat: Number(r.latitud),
|
||||||
|
lng: Number(r.longitud)
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
overlay.style.display = 'block';
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
|
||||||
|
const mapDiv = document.getElementById('map');
|
||||||
|
|
||||||
|
map = new google.maps.Map(mapDiv,{
|
||||||
|
zoom:15,
|
||||||
|
center:puntos[0]
|
||||||
|
});
|
||||||
|
|
||||||
|
const bounds = new google.maps.LatLngBounds();
|
||||||
|
|
||||||
|
puntos.forEach((p,i)=>{
|
||||||
|
|
||||||
|
new google.maps.Marker({
|
||||||
|
position:p,
|
||||||
|
map:map,
|
||||||
|
label:String(i+1)
|
||||||
|
});
|
||||||
|
|
||||||
|
bounds.extend(p);
|
||||||
|
});
|
||||||
|
|
||||||
|
new google.maps.Polyline({
|
||||||
|
path:puntos,
|
||||||
|
strokeWeight:4,
|
||||||
|
map:map
|
||||||
|
});
|
||||||
|
|
||||||
|
map.fitBounds(bounds);
|
||||||
|
|
||||||
|
// 🔥 recalculo REAL
|
||||||
|
google.maps.event.trigger(map,'resize');
|
||||||
|
map.fitBounds(bounds);
|
||||||
|
|
||||||
|
},400);
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
@endpush
|
||||||
@@ -7,11 +7,13 @@
|
|||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="card shadow mb-4">
|
<div class="card shadow mb-4">
|
||||||
<div class="card-header py-3">
|
<div class="card-header py-3">
|
||||||
<h6 class="m-0 font-weight-bold text-primary">Crear Nota</h6>
|
<div class="d-sm-flex align-items-center justify-content-between">
|
||||||
|
<h6 class="m-0 font-weight-bold text-primary">Editar horario</h6>
|
||||||
|
<a href="{{route('horario.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>
|
||||||
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<a href="{{route('horario.index')}}">Regresar</a>
|
|
||||||
<form action="{{route('horario.store')}}" method="POST">
|
<form action="{{route('horario.store')}}" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
@@ -74,7 +76,7 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
@endforeach
|
@endforeach
|
||||||
<input class="btn btn-primary" type="submit" value="Create">
|
<input class="btn btn-primary" type="submit" value="Guardar">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,11 +7,18 @@
|
|||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="card shadow mb-4">
|
<div class="card shadow mb-4">
|
||||||
<div class="card-header py-3">
|
<div class="card-header py-3">
|
||||||
<h6 class="m-0 font-weight-bold text-primary">Editar nota</h6>
|
<div class="d-sm-flex align-items-center justify-content-between">
|
||||||
|
<h6 class="m-0 font-weight-bold text-primary">Editar horario</h6>
|
||||||
|
<a href="{{route('horario.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>
|
||||||
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<a href="{{route('horario.index')}}">Regresar</a>
|
@if (session('info'))
|
||||||
|
<div class="alert alert-success">
|
||||||
|
<strong>{{session('info')}}</strong>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
<form action="{{ route('horario.update', $user->id) }}" method="POST">
|
<form action="{{ route('horario.update', $user->id) }}" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PUT')
|
@method('PUT')
|
||||||
@@ -89,7 +96,7 @@
|
|||||||
|
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
<input class="btn btn-primary" type="submit" value="Update">
|
<input class="btn btn-primary" type="submit" value="Actualizar">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<div class="d-sm-flex align-items-center justify-content-between">
|
<div class="d-sm-flex align-items-center justify-content-between">
|
||||||
<h6 class="m-0 font-weight-bold text-primary">Horarios</h6>
|
<h6 class="m-0 font-weight-bold text-primary">Horarios</h6>
|
||||||
@can('horario.create')
|
@can('horario.create')
|
||||||
<a href="{{route('horario.create')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Asignnar horarios a colaborador</a>
|
<a href="{{route('horario.create')}}" class="d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Asignar horarios a colaborador</a>
|
||||||
@endcan
|
@endcan
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
|
|
||||||
@can('horario.destroy')
|
@can('horario.destroy')
|
||||||
<div class="col-sm-6 col-md-6">
|
<div class="col-sm-6 col-md-6">
|
||||||
<form action="{{route('horario.destroy',$usuario->id)}}" method="POST">
|
<form class="delete-form" action="{{route('horario.destroy',$usuario->id)}}" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
@method('DELETE')
|
@method('DELETE')
|
||||||
<input type="submit" value="DELETE" class="btn btn-danger">
|
<input type="submit" value="DELETE" class="btn btn-danger">
|
||||||
@@ -81,4 +81,5 @@
|
|||||||
|
|
||||||
@section('scripts')
|
@section('scripts')
|
||||||
@include('layouts._partials.tablaScript')
|
@include('layouts._partials.tablaScript')
|
||||||
|
@include('layouts._partials.delete')
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<li class="nav-item active">
|
<li class="nav-item active">
|
||||||
<a class="nav-link" href="{{ route('dashboard') }}">
|
<a class="nav-link" href="{{ route('dashboard') }}">
|
||||||
<i class="fas fa-fw fa-tachometer-alt"></i>
|
<i class="fas fa-fw fa-tachometer-alt"></i>
|
||||||
<span>Dashboard</span></a>
|
<span>Inicio</span></a>
|
||||||
</li>
|
</li>
|
||||||
<!-- Divider -->
|
<!-- Divider -->
|
||||||
<hr class="sidebar-divider">
|
<hr class="sidebar-divider">
|
||||||
@@ -149,7 +149,7 @@
|
|||||||
</li> --}}
|
</li> --}}
|
||||||
|
|
||||||
|
|
||||||
@can('code.index')
|
@can('asistencia')
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseUtilities"
|
<a class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#collapseUtilities"
|
||||||
aria-expanded="true" aria-controls="collapseUtilities">
|
aria-expanded="true" aria-controls="collapseUtilities">
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
<div class="bg-white py-2 collapse-inner rounded">
|
<div class="bg-white py-2 collapse-inner rounded">
|
||||||
<h6 class="collapse-header">Herramientas:</h6>
|
<h6 class="collapse-header">Herramientas:</h6>
|
||||||
<a class="collapse-item" href="{{ route('code.index') }}" style="color:gray">Escanear</a>
|
<a class="collapse-item" href="{{ route('code.index') }}" style="color:gray">Escanear</a>
|
||||||
{{-- <a class="collapse-item" href="{{ route('code.show') }}" style="color:gray">Registros</a> --}}
|
<a class="collapse-item" href="{{ route('registros') }}" style="color:gray">Registros</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{{-- JS base --}}
|
{{-- JS base --}}
|
||||||
@include('layouts._partials.scripts')
|
@include('layouts._partials.scripts')
|
||||||
|
|
||||||
@@ -103,7 +104,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@stack('modals')
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -73,4 +73,5 @@
|
|||||||
|
|
||||||
@section('scripts')
|
@section('scripts')
|
||||||
@include('layouts._partials.tablaScript')
|
@include('layouts._partials.tablaScript')
|
||||||
|
@include('layouts._partials.delete')
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ Route::middleware(['auth:sanctum',config('jetstream.auth_session'),'verified',
|
|||||||
Route::resource('/plane',PlaneController::class);
|
Route::resource('/plane',PlaneController::class);
|
||||||
Route::resource('/plantel',PlantelController::class);
|
Route::resource('/plantel',PlantelController::class);
|
||||||
Route::resource('/prospecto',ProspectoController::class);
|
Route::resource('/prospecto',ProspectoController::class);
|
||||||
|
Route::get('/registros', [CodeController::class,'registros' ])->name('registros');
|
||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user