Basic design created

This commit is contained in:
2026-02-03 09:33:18 +01:00
parent 3570f442f5
commit e280fcfba8
29 changed files with 1055 additions and 28 deletions

View File

@@ -0,0 +1,21 @@
<?php
namespace App\Domains\UserManagement\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LogOutController {
public function __invoke(Request $request) {
Auth::logout();
// Session invalidieren
$request->session()->invalidate();
// CSRF-Token regenerieren (für Sicherheit)
$request->session()->regenerateToken();
// Redirect z.B. zur Login-Seite
return redirect()->intended('/')->with('status', 'Erfolgreich abgemeldet!');
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Domains\UserManagement\Controllers;
use App\Providers\InertiaProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController {
public function loginForm(Request $request) {
$errors = [];
if ($request->session()->has('errors')) {
$errors = $request->session()->get('errors')->getBag('default')->getMessages();
}
$inertiaProvider = new InertiaProvider('UserManagement/Login', ['errors' => $errors, 'appName' => app('tenant')->name]);
return $inertiaProvider->render();
}
public function doLogin(Request $request)
{
$credentials = $request->validate([
'username' => ['required', 'string'],
'password' => ['required'],
],
[
'username.required' => 'Bitte gib deinen Anmeldenamen ein.',
'username.string' => 'Der Anmeldename muss eine E-Mail-Adresse sein.',
'password.required' => 'Bitte gib dein Passwort ein.',
]);
#$credentials = ['username' => 'development', 'password' => 'development'];
if (!Auth::attempt($credentials)) {
return back()->withErrors([
'username' => 'Diese Zugangsdaten sind ungültig.',
]);
}
$request->session()->regenerate();
$user = Auth::user();
# dd($user->firstname . ' ' . $user->lastname);
return redirect()->intended('/');
}
}

View File

@@ -0,0 +1,64 @@
<script setup>
import AppLayout from '../../../../resources/js/layouts/AppLayout.vue'
import {onMounted, ref} from 'vue'
import { toast } from 'vue3-toastify'
import ShadowedBox from "../../../Views/Components/ShadowedBox.vue";
const props = defineProps({
navbar: Object,
tenant: String,
user: Object,
currentPath: String,
errors: Object,
})
onMounted(() => {
if (undefined !== props.errors && undefined !== props.errors.username) {
toast.error(props.errors.username[0])
}
})
//console.log(props.errors.password[0])
const username = ref('')
const password = ref('')
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content')
</script>
<template>
<AppLayout title='Anmelden' :user="props.user" :navbar="props.navbar" :tenant="props.tenant" :currentPath="props.currentPath">
<form method="POST" action="/login">
<input type="hidden" name="_token" :value="csrfToken" />
<shadowed-box style="width: 50%; margin: 150px auto; padding: 20px;">
<table>
<tr>
<th>Anmeldename</th>
<td>
<input type="text" name="username" id="username"></input>
</td>
</tr>
<tr>
<th>Passwort</th>
<td><input type="password" name="password" id="password"></input></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Anmelden" style="margin-top: 20px;" />
</td>
</tr>
</table>
</shadowed-box>
</form>
</AppLayout>
</template>
<style>
th {
width: 100px;
}
</style>