Besseres CSS; News

This commit is contained in:
2026-03-25 00:02:08 +01:00
parent ae9592902c
commit 7bf444123d
17 changed files with 310 additions and 107 deletions

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Http\Controllers;
use App\Models\Blog;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class BlogController extends Controller
{
public static function blogPaginated(){
return Blog::where('language', App::getLocale())->where('published', 1)->orderBy('id', 'desc')->paginate(5);
}
}

View File

@@ -11,6 +11,16 @@ class TickerController extends Controller
{
public function deleteTicker(Request $request){
if(Auth::check()){
$toDelete = $request->input('delete')[0];
try{
foreach($toDelete as $item){
$ticker = TickerMessages::find($item);
$ticker->delete();
}
return ["messageStatus" => "success", "errorMessage" => ""];
} catch(\Exception $e){
return ["messageStatus" => "failure", "errorMessage" => $e->getMessage()];
}
}
abort(404);
@@ -18,7 +28,18 @@ class TickerController extends Controller
public function addTicker(Request $request){
if(Auth::check()){
$toAdd = $request->input('insert');
$lang = $request->input('lang');
try {
$ticker = new TickerMessages();
$ticker->message = $toAdd;
$ticker->language = $lang;
$ticker->save();
return ["messageStatus" => "success", "errorMessage" => ""];
} catch(\Exception $e){
return ["messageStatus" => "failure", "errorMessage" => $e->getMessage()];
}
}
abort(404);
}
@@ -26,9 +47,13 @@ class TickerController extends Controller
public static function getTicker(){
$t = "";
foreach(TickerMessages::getMessages(App::getLocale())->get() as $message){
$t .= " -- " . $message->message;
$t .= " -- $message->message";
}
$t .= " -- ";
if(!empty($t)){
$t .= " -- ";
}
return $t;
}
}

View File

@@ -42,7 +42,7 @@ class WebsiteController extends Controller
}
public function news(Request $request){
return view('content.news');
return view('content.news', ['blogs' => BlogController::blogPaginated()]);
}
public function services(Request $request){

13
app/Models/Blog.php Normal file
View File

@@ -0,0 +1,13 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{
//
protected $table = 'blogs';
}

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('blogs', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('published_by');
$table->foreign('published_by')->references('id')->on('users');
$table->string('language');
$table->string('title');
$table->text('body');
$table->boolean('published')->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('blogs');
}
};

View File

@@ -2,6 +2,7 @@ html, body {
margin: 0;
width: 100vw;
height: 100vh;
background-color: #4b0600;
}
.ticker {
@@ -61,23 +62,56 @@ html, body {
.main {
float: left;
display: flex;
flex-direction: row;
margin: 0;
height: 77vh;
min-height: 77vh;
width: 100vw;
}
.navbar {
float: left;
background-color: #ccc;
height: 77vh;
width: 20vw;
}
.content {
float: left;
background-color: #dcccaa;
height: 77vh;
width: 79vw;
width: 80vw;
padding-left: 1vw;
}
.eingabemaske {
border: 5px inset;
font-size: 1.2em;
}
.eingabemaske table, th, td {
border: 4px outset;
}
.eingabemaske input {
padding: 0.5em;
}
.eingabemaske button {
padding: 1em;
border: 4px outset;
font-size: 1.2em;
}
#fehlermeldung {
border: 4px outset;
width: 50vw;
}
nav {
font-size: 1.2em;
}
.w-5 {
width: 5vw;
}
.h-5 {
height: 5vh;
}

View File

@@ -0,0 +1,10 @@
.split-left {
float: left;
width: 21%;
}
.split-right {
float: left;
width: 50%;
border-left: 1px dotted #000;
padding-left: 30px;
}

12
public/js/intern.js Normal file
View File

@@ -0,0 +1,12 @@
function setzeFehlermeldung(alertType, message){
let f = $("#fehlermeldung");
switch(alertType){
case "success":
f.css("border-color", "#0033cc");
break;
case "failure":
f.css("border-color", "#cc3300");
break;
}
f.html(message);
}

View File

@@ -1,12 +1,3 @@
function setzeFehlermeldung(alertType, message){
let f = $("#fehlermeldung");
f.removeClass('alert-success').removeClass('alert-danger').removeClass('alert-primary');
f.addClass('alert-' + alertType);
f.html(message);
}
function login(){
let data = {};
data.mail = $("#mail").val();
@@ -24,15 +15,15 @@ function login(){
location.reload();
break;
case "failure":
setzeFehlermeldung("danger", "Es ist ein Fehler geschehen: " + d.errorMessage);
setzeFehlermeldung("failure", "Es ist ein Fehler geschehen: " + d.errorMessage);
break;
case "not permitted":
setzeFehlermeldung("warning", "Sie sind nicht berechtigt diese Funktion zu nutzen.");
setzeFehlermeldung("failure", "Sie sind nicht berechtigt diese Funktion zu nutzen.");
break;
}
},
error: function(d, status, errorThrown) {
setzeFehlermeldung("danger", "Es ist ein Fehler geschehen: " + errorThrown);
setzeFehlermeldung("failure", "Es ist ein Fehler geschehen: " + errorThrown);
}
});

View File

@@ -1,12 +1,3 @@
function setzeFehlermeldung(alertType, message){
let f = $("#fehlermeldung");
f.removeClass('alert-success').removeClass('alert-danger').removeClass('alert-primary');
f.addClass('alert-' + alertType);
f.html(message);
}
function abschicken(){
let data = {};
data.mail = $("#mail").val();
@@ -16,7 +7,7 @@ function abschicken(){
if(data.password !== $("#password_repeat").val()) {
setzeFehlermeldung("danger", "Ihr Kennwort stimmt nicht überein.");
setzeFehlermeldung("failure", "Ihr Kennwort stimmt nicht überein.");
for(let i=0; i<Math.random() * 10; i++){
alert("Ihr Kennwort stimmt nicht überein.");
}
@@ -33,15 +24,15 @@ function abschicken(){
setzeFehlermeldung("success", "Sie wurden erfolgreich registriert.")
break;
case "failure":
setzeFehlermeldung("danger", "Es ist ein Fehler geschehen: " + d.errorMessage);
setzeFehlermeldung("failure", "Es ist ein Fehler geschehen: " + d.errorMessage);
break;
case "not permitted":
setzeFehlermeldung("warning", "Sie sind nicht berechtigt diese Funktion zu nutzen.");
setzeFehlermeldung("failure", "Sie sind nicht berechtigt diese Funktion zu nutzen.");
break;
}
},
error: function(d, status, errorThrown) {
setzeFehlermeldung("danger", "Es ist ein Fehler geschehen: " + errorThrown);
setzeFehlermeldung("failure", "Es ist ein Fehler geschehen: " + errorThrown);
}
});
}

View File

@@ -1,11 +1,57 @@
function remove(lang){
let s = [];
let data = {};
data["delete"] = [];
$("#ticker_" + lang).each(function(){
s.push($(this).val());
data["delete"].push($(this).val());
});
console.log(JSON.stringify(data));
$.ajax({
type: "DELETE",
url: "/intern/ticker/remove",
data: data,
dataType: "json",
success: function (d) {
switch(d.messageStatus){
case "success":
setzeFehlermeldung(d.messageStatus, "Löschen erfolgreich!");
location.reload();
break;
case "failure":
setzeFehlermeldung(d.messageStatus, d.errorMessage);
break;
}
},
error: function (d, status, error) {
setzeFehlermeldung("failure", error);
}
});
console.log(JSON.stringify(s));
}
function insert(lang){
let data = {};
data.insert = $("#insert_" + lang).val();
data.lang = lang;
$.ajax({
type: "PUT",
url: "/intern/ticker/add",
data: data,
dataType: "json",
success: function (d) {
switch(d.messageStatus){
case "success":
setzeFehlermeldung(d.messageStatus, "Einfügen erfolgreich!");
location.reload();
break;
case "failure":
setzeFehlermeldung(d.messageStatus, d.errorMessage);
break;
}
},
error: function (d, status, error) {
setzeFehlermeldung("failure", error);
}
});
}

View File

@@ -3,5 +3,16 @@
@endsection
@section('content')
<h1>{{ __('app.nav.news') }}</h1>
@foreach($blogs as $blog)
<h2>{{ $blog->title }}</h2>
<b>{{ $blog->created_at }}</b><br />
<p>{!! $blog->body !!}</p>
<br />
<hr>
<br />
@endforeach
<br /><br />
{{ $blogs->links() }}
<br /><br />
@endsection

View File

@@ -9,22 +9,20 @@
@yield('scripts')
</head>
<body>
<div class="grid">
<div class="ticker row">
<div class="col">
<marquee>{{\App\Http\Controllers\TickerController::getTicker()}}</marquee>
</div>
<div class="ticker">
<marquee>{{\App\Http\Controllers\TickerController::getTicker()}}</marquee>
</div>
<div class="header row">
<div class="header-main col">
<div class="header">
<div class="header-main">
<a href="/">
<img id="logo" src="{{ asset("Bilder/logo.png") }}" alt="{{ __('app.logo') }}">
</a>
</div>
<div class="banner col-8 text-center">
<div class="banner">
<img src="{{ asset("Bilder/banner2.gif") }}" alt="{{ __("app.banner") }}">
</div>
<div class="language-area col">
<div class="language-area">
<div class="language">
<img alt="{{ __('app.language.de') }}" onclick="setLanguage('de')" src="{{ asset("Bilder/deutsch.gif") }}">
<img alt="{{ __('app.language.en') }}" onclick="setLanguage('en')" src="{{ asset("Bilder/englisch.gif") }}">
@@ -33,8 +31,8 @@
<div class="login-status">{{ __('app.signed_in_as') }} {{Auth::user()->name ?? __("app.guest")}}</div>
</div>
</div>
<div class="main row">
<div class="navbar col-2">
<div class="main">
<div class="navbar">
<ul>
<li><a href="{{ route('about') }}">{{ __('app.nav.about') }}</a></li>
<li><a href="{{ route('services') }}">{{ __('app.nav.services') }}</a></li>

View File

@@ -1,5 +1,6 @@
@extends('layout.app')
@section('scripts')
<script src="{{ asset("js/intern.js") }}"></script>
<script src="{{ asset("js/login/login.js") }}"></script>
@endsection
@@ -9,21 +10,26 @@
<span>
@guest
<div id="fehlermeldung" class="alert alert-primary">Bitte melden Sie sich an.</div>
<div id="fehlermeldung"></div>
<label class="form-label" for="mail">Elektronische Postadresse:</label>
<input class="form-control" type="text" id="mail" pattern="^[0-9A-Za-z+_\-]+@[0-9A-Za-z_\-]+\.[0-9A-Za-z]+$"
title="Nur echte Adressen der elektronischen Post verwenden!"/>
<label class="form-label" for="password">Kennwort:</label>
<input class="form-control" type="password" id="password">
<table class="eingabemaske">
<tr>
<td><label for="mail">Elektronische Postadresse:</label></td>
<td><input size="32" type="text" id="mail" pattern="^[0-9A-Za-z+_\-]+@[0-9A-Za-z_\-]+\.[0-9A-Za-z]+$"
title="Nur echte Adressen der elektronischen Post verwenden!"/></td>
</tr>
<tr>
<td><label for="password">Kennwort:</label></td>
<td><input size="32" type="password" id="password"></td>
</tr>
</table>
<br/><br/>
<button onclick="login()">Anmelden</button>
<button class="eingabemaske" onclick="login()">Anmelden</button>
@endguest
@auth
<div id="fehlermeldung" class="alert alert-success">Sie sind angemeldet.</div>
<div id="fehlermeldung">Sie sind angemeldet.</div>
<a href="{{ route('logout') }}"><button>Abmelden</button></a>
@endauth

View File

@@ -1,5 +1,6 @@
@extends('layout.app')
@section('scripts')
<script src="{{ asset("js/intern.js") }}"></script>
<script src="{{ asset("js/login/registrieren.js") }}"></script>
@endsection
@@ -10,24 +11,32 @@
<div id="fehlermeldung" class="alert alert-primary">Bitte registrieren Sie sich.</div>
<label class="form-label" for="mail">Elektronische Postadresse:</label>
<input class="form-control" type="text" id="mail" pattern="^[0-9A-Za-z+_\-]+@[0-9A-Za-z_\-]+\.[0-9A-Za-z]+$"
title="Nur echte Adressen der elektronischen Post verwenden!"/>
<label class="form-label" for="username">(Vollständiger) Name:</label>
<input class="form-control" type="text" id="username"/>
<label class="form-label" for="password">Kennwort:</label>
<input class="form-control" type="password" id="password">
<label class="form-label" for="password_repeat">Kennwort wiederholen:</label>
<input class="form-control" type="password" id="password_repeat">
<label class="form-label" for="register_token">Registrierungsnummer:</label>
<input class="form-control" type="text" id="register_token">
<table class="eingabemaske">
<tr>
<td><label for="mail">Elektronische Postadresse:</label></td>
<td><input size="32" type="text" id="mail" pattern="^[0-9A-Za-z+_\-]+@[0-9A-Za-z_\-]+\.[0-9A-Za-z]+$"
title="Nur echte Adressen der elektronischen Post verwenden!"/></td>
</tr>
<tr>
<td><label for="username">(Vollständiger) Name:</label></td>
<td><input size="32" type="text" id="username"/></td>
</tr>
<tr>
<td><label for="password">Kennwort:</label></td>
<td><input size="32" type="password" id="password"></td>
</tr>
<tr>
<td><label for="password_repeat">Kennwort wiederholen:</label></td>
<td><input size="32" type="password" id="password_repeat"></td>
</tr>
<tr>
<td><label for="register_token">Registrierungsnummer:</label></td>
<td><input size="32" type="text" id="register_token"></td>
</tr>
</table>
<br/><br/>
<button onclick="abschicken()" class="btn btn-success">Registrieren</button>
<button class="eingabemaske" onclick="abschicken()">Registrieren</button>
</span>
@endsection

View File

@@ -1,44 +1,48 @@
@extends('layout.app')
@section('scripts')
<link rel="stylesheet" href="{{ asset("css/ticker/ticker.css") }}">
<script src="{{ asset("js/intern.js") }}"></script>
<script src="{{ asset("js/ticker/edit.js") }}"></script>
@endsection
@section('content')
<h1>Ticker bearbeiten</h1>
<br />
<h2>Deutsch</h2>
<label for="ticker_de">Aktive Tickernachrichten:</label>
<select class="form-control" name="ticker_de" id="ticker_de" multiple>
@foreach(\App\Models\TickerMessages::where('language', 'de')->orderBy('updated_at', 'desc')->get() as $tm)
<option value="{{$tm->id}}">{{$tm->message}}</option>
@endforeach
</select>
<br />
<button onclick="remove('de')">Ausgewählte Tickernachricht löschen</button>
<br /><br /><br />
<div id="fehlermeldung">Hier kann der Ticker verändert werden.</div>
<div class="split-left">
<h2>Deutsch</h2>
<label for="ticker_de">Aktive Tickernachrichten:</label><br /><br />
<select name="ticker_de" id="ticker_de" multiple>
@foreach(\App\Models\TickerMessages::where('language', 'de')->orderBy('updated_at', 'desc')->get() as $tm)
<option value="{{$tm->id}}">{{$tm->message}}</option>
@endforeach
</select>
<br /><br />
<button onclick="remove('de')">Ausgewählte Tickernachricht löschen</button>
<br /><br /><br />
<label for="insert_de">Tickernachricht:</label>
<input class="form-control" type="text" id="insert_de">
<br />
<button onclick="insert('de')">Tickernachricht hinzufügen</button>
<label for="insert_de">Tickernachricht erstellen: </label><br />
<input size="32" type="text" id="insert_de">
<br /><br />
<button onclick="insert('de')">Tickernachricht hinzufügen</button>
</div>
<div class="split-right">
<h2>Englisch</h2>
<label for="ticker_en">Aktive Tickernachrichten:</label><br /><br />
<select name="ticker_en" id="ticker_en" multiple>
@foreach(\App\Models\TickerMessages::where('language', 'en')->orderBy('updated_at', 'desc')->get() as $tm)
<option value="{{$tm->id}}">{{$tm->message}}</option>
@endforeach
</select>
<br /><br />
<button onclick="remove('en')">Ausgewählte Tickernachricht löschen</button>
<br /><br /><br />
<label for="insert_de">Tickernachricht erstellen: </label><br />
<input size="32" type="text" id="insert_en">
<br /><br />
<button onclick="insert('en')">Tickernachricht hinzufügen</button>
</div>
<br />
<hr />
<br />
<h2>Englisch</h2>
<label for="ticker_en">Aktive Tickernachrichten:</label>
<select class="form-control" name="ticker_en" id="ticker_en" multiple>
@foreach(\App\Models\TickerMessages::where('language', 'en')->orderBy('updated_at', 'desc')->get() as $tm)
<option value="{{$tm->id}}">{{$tm->message}}</option>
@endforeach
</select>
<br />
<button onclick="remove('en')">Ausgewählte Tickernachricht löschen</button>
<br /><br /><br />
<label for="insert_en">Tickernachricht:</label>
<input class="form-control" type="text" id="insert_en">
<br />
<button onclick="insert('en')">Tickernachricht hinzufügen</button>
@endsection

View File

@@ -2,6 +2,7 @@
use App\Http\Controllers\LoginController;
use App\Http\Controllers\WebsiteController;
use App\Http\Controllers\TickerController;
use Illuminate\Support\Facades\Route;
@@ -26,4 +27,8 @@ Route::get('/intern/abmelden', function(){
})->name('logout');
Route::get('/intern/ticker', [WebsiteController::class, 'editTicker'])->name('editTicker');
Route::delete('/intern/ticker/remove', [TickerController::class, 'deleteTicker']);
Route::put('/intern/ticker/add', [TickerController::class, 'addTicker']);
Route::get('/intern/nachrichten', [WebsiteController::class, 'editNews'])->name('editNews');