add error handling (frontend) + exception changes
Co-authored-by: Christoph <tobi@urpost.de> Co-authored-by: Mahgs <maxoerter@gmx.de>
This commit is contained in:
@ -2,19 +2,16 @@ package mops.gruppen2.controller;
|
|||||||
|
|
||||||
import mops.gruppen2.config.Gruppen2Config;
|
import mops.gruppen2.config.Gruppen2Config;
|
||||||
import mops.gruppen2.domain.Exceptions.EventException;
|
import mops.gruppen2.domain.Exceptions.EventException;
|
||||||
|
import mops.gruppen2.domain.Exceptions.GroupNotFoundException;
|
||||||
import mops.gruppen2.domain.Group;
|
import mops.gruppen2.domain.Group;
|
||||||
import mops.gruppen2.domain.User;
|
import mops.gruppen2.domain.User;
|
||||||
import mops.gruppen2.domain.Visibility;
|
|
||||||
import mops.gruppen2.domain.event.CreateGroupEvent;
|
|
||||||
import mops.gruppen2.security.Account;
|
import mops.gruppen2.security.Account;
|
||||||
import mops.gruppen2.service.*;
|
import mops.gruppen2.service.*;
|
||||||
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
|
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.client.RestTemplate;
|
|
||||||
import org.springframework.web.context.annotation.SessionScope;
|
import org.springframework.web.context.annotation.SessionScope;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import org.springframework.web.server.ResponseStatusException;
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
@ -125,7 +122,7 @@ public class Gruppen2Controller {
|
|||||||
|
|
||||||
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"})
|
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"})
|
||||||
@GetMapping("/details")
|
@GetMapping("/details")
|
||||||
public String showGroupDetails(KeycloakAuthenticationToken token, Model model, @RequestParam(value = "id") Long id) throws EventException, ResponseStatusException {
|
public String showGroupDetails(KeycloakAuthenticationToken token, Model model, @RequestParam(value = "id") Long id) throws ResponseStatusException, EventException {
|
||||||
model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token));
|
model.addAttribute("account", keyCloakService.createAccountFromPrincipal(token));
|
||||||
Group group = userService.getGroupById(id);
|
Group group = userService.getGroupById(id);
|
||||||
Account account = keyCloakService.createAccountFromPrincipal(token);
|
Account account = keyCloakService.createAccountFromPrincipal(token);
|
||||||
@ -135,7 +132,7 @@ public class Gruppen2Controller {
|
|||||||
model.addAttribute("role", group.getRoles().get(user.getUser_id()));
|
model.addAttribute("role", group.getRoles().get(user.getUser_id()));
|
||||||
return "detailsMember";
|
return "detailsMember";
|
||||||
}
|
}
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group not found");
|
throw new GroupNotFoundException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"})
|
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"})
|
||||||
@ -156,7 +153,7 @@ public class Gruppen2Controller {
|
|||||||
model.addAttribute("group", group);
|
model.addAttribute("group", group);
|
||||||
return "detailsNoMember";
|
return "detailsNoMember";
|
||||||
}
|
}
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group not found");
|
throw new GroupNotFoundException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"})
|
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"})
|
||||||
@ -168,10 +165,10 @@ public class Gruppen2Controller {
|
|||||||
model.addAttribute("group", group);
|
model.addAttribute("group", group);
|
||||||
return "redirect:/gruppen2/detailsSearch?id=" + group.getId();
|
return "redirect:/gruppen2/detailsSearch?id=" + group.getId();
|
||||||
}
|
}
|
||||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group not found");
|
throw new GroupNotFoundException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator"})
|
@RolesAllowed({"ROLE_orga", "ROLE_studentin", "ROLE_actuator)"})
|
||||||
@PostMapping("/leaveGroup")
|
@PostMapping("/leaveGroup")
|
||||||
public String pLeaveGroup(KeycloakAuthenticationToken token, @RequestParam(value = "group_id") Long id) {
|
public String pLeaveGroup(KeycloakAuthenticationToken token, @RequestParam(value = "group_id") Long id) {
|
||||||
Account account = keyCloakService.createAccountFromPrincipal(token);
|
Account account = keyCloakService.createAccountFromPrincipal(token);
|
||||||
@ -181,6 +178,6 @@ public class Gruppen2Controller {
|
|||||||
|
|
||||||
@GetMapping("*")
|
@GetMapping("*")
|
||||||
public String defaultLink() {
|
public String defaultLink() {
|
||||||
return "errorRenameLater";
|
return "error";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,13 @@
|
|||||||
package mops.gruppen2.domain.Exceptions;
|
package mops.gruppen2.domain.Exceptions;
|
||||||
|
|
||||||
public class EventException extends Exception {
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.web.server.ResponseStatusException;
|
||||||
|
|
||||||
|
public class EventException extends ResponseStatusException {
|
||||||
private String msg;
|
private String msg;
|
||||||
|
|
||||||
public EventException(String msg) {
|
public EventException(String msg, HttpStatus status) {
|
||||||
this.msg = msg;
|
super(status, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -0,0 +1,13 @@
|
|||||||
|
package mops.gruppen2.domain.Exceptions;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
|
public class GroupIdMismatchException extends EventException {
|
||||||
|
public GroupIdMismatchException(String msg) {
|
||||||
|
super("Falsche Gruppe für Event." + " (" + msg + ")", HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GroupIdMismatchException() {
|
||||||
|
super("", HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
package mops.gruppen2.domain.Exceptions;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
|
public class GroupNotFoundException extends EventException {
|
||||||
|
public GroupNotFoundException(String msg) {
|
||||||
|
super(msg, HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GroupNotFoundException() {
|
||||||
|
super("Gruppe nicht gefunden.", HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,7 +1,13 @@
|
|||||||
package mops.gruppen2.domain.Exceptions;
|
package mops.gruppen2.domain.Exceptions;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
public class UserAlreadyExistsException extends EventException {
|
public class UserAlreadyExistsException extends EventException {
|
||||||
public UserAlreadyExistsException(String msg){
|
public UserAlreadyExistsException(String msg) {
|
||||||
super(msg);
|
super(msg, HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserAlreadyExistsException() {
|
||||||
|
super("Der User existiert bereits.", HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,13 @@
|
|||||||
package mops.gruppen2.domain.Exceptions;
|
package mops.gruppen2.domain.Exceptions;
|
||||||
|
|
||||||
public class UserNotFoundException extends EventException{
|
import org.springframework.http.HttpStatus;
|
||||||
public UserNotFoundException(String msg){
|
|
||||||
super(msg);
|
public class UserNotFoundException extends EventException {
|
||||||
|
public UserNotFoundException(String msg) {
|
||||||
|
super(msg, HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserNotFoundException() {
|
||||||
|
super("Der User wurde nicht gefunden.", HttpStatus.NOT_FOUND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +0,0 @@
|
|||||||
package mops.gruppen2.domain;
|
|
||||||
|
|
||||||
import lombok.Value;
|
|
||||||
|
|
||||||
// @ApiModelProperty
|
|
||||||
@Value
|
|
||||||
public class ProductSwaggerExample {
|
|
||||||
|
|
||||||
// @ApiModelProperty
|
|
||||||
String name;
|
|
||||||
String description;
|
|
||||||
}
|
|
||||||
@ -27,11 +27,12 @@ public class AddUserEvent extends Event {
|
|||||||
this.email = email;
|
this.email = email;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Group group) throws EventException{
|
@Override
|
||||||
|
public void applyEvent(Group group) throws EventException {
|
||||||
User user = new User(this.user_id, this.givenname, this.familyname, this.email);
|
User user = new User(this.user_id, this.givenname, this.familyname, this.email);
|
||||||
|
|
||||||
if (group.getMembers().contains(user)){
|
if (group.getMembers().contains(user)) {
|
||||||
throw new UserAlreadyExistsException("Der User existiert bereits");
|
throw new UserAlreadyExistsException();
|
||||||
}
|
}
|
||||||
|
|
||||||
group.getMembers().add(user);
|
group.getMembers().add(user);
|
||||||
|
|||||||
@ -15,8 +15,6 @@ public class CreateGroupEvent extends Event {
|
|||||||
private Long groupParent;
|
private Long groupParent;
|
||||||
private GroupType groupType;
|
private GroupType groupType;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public CreateGroupEvent(Long group_id, String user_id, Long parent, GroupType type, Visibility visibility) {
|
public CreateGroupEvent(Long group_id, String user_id, Long parent, GroupType type, Visibility visibility) {
|
||||||
super(group_id, user_id);
|
super(group_id, user_id);
|
||||||
this.groupParent = parent;
|
this.groupParent = parent;
|
||||||
@ -24,7 +22,8 @@ public class CreateGroupEvent extends Event {
|
|||||||
this.groupVisibility = visibility;
|
this.groupVisibility = visibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Group group) {
|
@Override
|
||||||
|
public void applyEvent(Group group) {
|
||||||
group.setId(this.group_id);
|
group.setId(this.group_id);
|
||||||
group.setParent(this.groupParent);
|
group.setParent(this.groupParent);
|
||||||
group.setType(this.groupType);
|
group.setType(this.groupType);
|
||||||
|
|||||||
@ -13,7 +13,7 @@ public class DeleteGroupEvent extends Event {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void apply(Group group) {
|
public void applyEvent(Group group) {
|
||||||
group.getRoles().clear();
|
group.getRoles().clear();
|
||||||
group.getMembers().clear();
|
group.getMembers().clear();
|
||||||
group.setTitle(null);
|
group.setTitle(null);
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
import lombok.*;
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
import mops.gruppen2.domain.Exceptions.EventException;
|
import mops.gruppen2.domain.Exceptions.EventException;
|
||||||
import mops.gruppen2.domain.Exceptions.UserNotFoundException;
|
import mops.gruppen2.domain.Exceptions.UserNotFoundException;
|
||||||
import mops.gruppen2.domain.Group;
|
import mops.gruppen2.domain.Group;
|
||||||
import mops.gruppen2.domain.User;
|
import mops.gruppen2.domain.User;
|
||||||
import mops.gruppen2.domain.Group;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entfernt ein einzelnes Mitglied einer Gruppe.
|
* Entfernt ein einzelnes Mitglied einer Gruppe.
|
||||||
@ -17,7 +17,8 @@ public class DeleteUserEvent extends Event {
|
|||||||
super(group_id, user_id);
|
super(group_id, user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Group group) throws EventException {
|
@Override
|
||||||
|
public void applyEvent(Group group) throws EventException {
|
||||||
for (User user : group.getMembers()) {
|
for (User user : group.getMembers()) {
|
||||||
if (user.getUser_id().equals(this.user_id)) {
|
if (user.getUser_id().equals(this.user_id)) {
|
||||||
group.getMembers().remove(user);
|
group.getMembers().remove(user);
|
||||||
|
|||||||
@ -31,7 +31,22 @@ public class Event {
|
|||||||
Long group_id;
|
Long group_id;
|
||||||
String user_id;
|
String user_id;
|
||||||
|
|
||||||
|
|
||||||
public void apply(Group group) throws EventException {
|
public void apply(Group group) throws EventException {
|
||||||
|
checkGroupIdMatch(group.getId());
|
||||||
|
applyEvent(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void applyEvent(Group group) throws EventException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkGroupIdMatch(Long group_id) {
|
||||||
|
if (this.group_id.equals(group_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//throw new GroupIdMismatchException(this.getClass().toString());
|
||||||
|
System.out.println(group_id);
|
||||||
|
System.out.println(this.group_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,8 @@ public class UpdateGroupDescriptionEvent extends Event {
|
|||||||
this.newGroupDescription = newGroupDescription;
|
this.newGroupDescription = newGroupDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Group group) {
|
@Override
|
||||||
|
public void applyEvent(Group group) {
|
||||||
group.setDescription(this.newGroupDescription);
|
group.setDescription(this.newGroupDescription);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,8 @@ public class UpdateGroupTitleEvent extends Event {
|
|||||||
this.newGroupTitle = newGroupTitle;
|
this.newGroupTitle = newGroupTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Group group) {
|
@Override
|
||||||
|
public void applyEvent(Group group) {
|
||||||
group.setTitle(this.newGroupTitle);
|
group.setTitle(this.newGroupTitle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,11 @@
|
|||||||
package mops.gruppen2.domain.event;
|
package mops.gruppen2.domain.event;
|
||||||
|
|
||||||
import lombok.*;
|
import lombok.AllArgsConstructor;
|
||||||
import mops.gruppen2.domain.Exceptions.EventException;
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
import mops.gruppen2.domain.Exceptions.UserNotFoundException;
|
import mops.gruppen2.domain.Exceptions.UserNotFoundException;
|
||||||
import mops.gruppen2.domain.Group;
|
import mops.gruppen2.domain.Group;
|
||||||
import mops.gruppen2.domain.Role;
|
import mops.gruppen2.domain.Role;
|
||||||
import mops.gruppen2.domain.User;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Aktualisiert die Gruppenrolle eines Teilnehmers.
|
* Aktualisiert die Gruppenrolle eines Teilnehmers.
|
||||||
@ -24,9 +22,10 @@ public class UpdateRoleEvent extends Event {
|
|||||||
this.newRole = newRole;
|
this.newRole = newRole;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Group group) throws UserNotFoundException{
|
@Override
|
||||||
if (!group.getRoles().containsKey(user_id)){
|
public void applyEvent(Group group) throws UserNotFoundException {
|
||||||
throw new UserNotFoundException("Der User wurde nicht gefunden");
|
if (!group.getRoles().containsKey(user_id)) {
|
||||||
|
throw new UserNotFoundException();
|
||||||
}
|
}
|
||||||
group.getRoles().put(this.user_id, this.newRole);
|
group.getRoles().put(this.user_id, this.newRole);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,11 +6,7 @@ import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticatio
|
|||||||
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
|
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
|
||||||
import org.keycloak.representations.AccessToken;
|
import org.keycloak.representations.AccessToken;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.*;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.context.annotation.Scope;
|
|
||||||
import org.springframework.context.annotation.ScopedProxyMode;
|
|
||||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
||||||
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
||||||
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;
|
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package mops.gruppen2.service;
|
package mops.gruppen2.service;
|
||||||
|
|
||||||
import mops.gruppen2.domain.Exceptions.EventException;
|
import mops.gruppen2.domain.Exceptions.EventException;
|
||||||
|
import mops.gruppen2.domain.Exceptions.GroupNotFoundException;
|
||||||
import mops.gruppen2.domain.Group;
|
import mops.gruppen2.domain.Group;
|
||||||
import mops.gruppen2.domain.User;
|
import mops.gruppen2.domain.User;
|
||||||
import mops.gruppen2.domain.event.Event;
|
import mops.gruppen2.domain.event.Event;
|
||||||
@ -39,7 +40,12 @@ public class UserService {
|
|||||||
public Group getGroupById(Long group_id) throws EventException {
|
public Group getGroupById(Long group_id) throws EventException {
|
||||||
List<Long> group_ids = new ArrayList<>();
|
List<Long> group_ids = new ArrayList<>();
|
||||||
group_ids.add(group_id);
|
group_ids.add(group_id);
|
||||||
|
|
||||||
|
try {
|
||||||
List<Event> events = groupService.getGroupEvents(group_ids);
|
List<Event> events = groupService.getGroupEvents(group_ids);
|
||||||
return groupService.projectEventList(events).get(0);
|
return groupService.projectEventList(events).get(0);
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
throw new GroupNotFoundException("Gruppe nicht gefunden");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,4 +18,5 @@ keycloak.verify-token-audience=true
|
|||||||
keycloak.use-resource-role-mappings=true
|
keycloak.use-resource-role-mappings=true
|
||||||
|
|
||||||
keycloak.autodetect-bearer-only=true
|
keycloak.autodetect-bearer-only=true
|
||||||
keycloak.confidential-port= 443
|
keycloak.confidential-port=443
|
||||||
|
server.error.include-stacktrace=always
|
||||||
|
|||||||
34
src/main/resources/templates/error.html
Normal file
34
src/main/resources/templates/error.html
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport">
|
||||||
|
<link crossorigin="anonymous" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
|
||||||
|
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" rel="stylesheet">
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Seite nicht gefunden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="mx-auto" style="vertical-align: center; horiz-align: center; top: 50%; left: 50%;">
|
||||||
|
<div class="jumbotron" style="background: aliceblue">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="display-3">UPSI</h1>
|
||||||
|
<p class="lead">Da ist wohl etwas schiefgelaufen :(</p><br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<div class="card mb-4 shadow-sm">
|
||||||
|
<div class="card-header">
|
||||||
|
<h4 class="my-0 font-weight-normal" th:text="${status} + ': ' + ${error}"></h4>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<p th:text="${message}"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p><a class="btn btn-primary btn-lg" href="#" onclick="window.history.back(-1);return false;" role="button">Zurück</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@ -1,26 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
||||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Error</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="mx-auto" style="vertical-align: center; horiz-align: center; top: 50%; left: 50%; margin-top: 200px">
|
|
||||||
<div class="text-center" style="background: aliceblue; align-items: center; margin: auto; width: 1000px; vertical-align: center; padding: 50px; display: block">
|
|
||||||
<h1 style="text-align: center">Da ist etwas schiefgelaufen!</h1>
|
|
||||||
<h2 style="text-align: center">Die Seite, nach der du suchst, scheint nicht zu existieren.</h2>
|
|
||||||
<br>
|
|
||||||
<div>
|
|
||||||
<button type="button" class="btn btn-primary" style="margin: auto">
|
|
||||||
<a style="color: white" href="#" onclick="javascript:window.history.back(-1);return false;">Zurück zur letzten Seite</a>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Reference in New Issue
Block a user