Compare commits
27 Commits
frontend
...
6852923db0
Author | SHA1 | Date | |
---|---|---|---|
6852923db0 | |||
71d838da0a | |||
8583012c5b | |||
31a381bba4 | |||
a72a0c5fc5 | |||
cbd7b0f8cc | |||
db1b26f017 | |||
ce23d839a3 | |||
36d6364cd0 | |||
d8865cbd27 | |||
![]() |
5477e7fdd8 | ||
![]() |
db526e5bb2 | ||
![]() |
dd6e98fe28 | ||
66ff531ba4 | |||
1964cadd8c | |||
![]() |
5965e1df81 | ||
![]() |
8d4376d313 | ||
![]() |
49a8f6a1dc | ||
![]() |
78e1e72eba | ||
![]() |
4fa775f326 | ||
6e3e3708b2 | |||
5bde268b89 | |||
5cef69ae81 | |||
f3699cb287 | |||
1f8e7dc67b | |||
1df705a235 | |||
5594d469de |
193
.gitignore
vendored
Normal file
193
.gitignore
vendored
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/intellij,windows,macos,git
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=intellij,windows,macos,git
|
||||||
|
|
||||||
|
### Git ###
|
||||||
|
# Created by git for backups. To disable backups in Git:
|
||||||
|
# $ git config --global mergetool.keepBackup false
|
||||||
|
*.orig
|
||||||
|
|
||||||
|
# Created by git when using merge tools for conflicts
|
||||||
|
*.BACKUP.*
|
||||||
|
*.BASE.*
|
||||||
|
*.LOCAL.*
|
||||||
|
*.REMOTE.*
|
||||||
|
*_BACKUP_*.txt
|
||||||
|
*_BASE_*.txt
|
||||||
|
*_LOCAL_*.txt
|
||||||
|
*_REMOTE_*.txt
|
||||||
|
|
||||||
|
### Intellij ###
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/encodings.xml
|
||||||
|
.idea/php.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# AWS User-specific
|
||||||
|
.idea/**/aws.xml
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/artifacts
|
||||||
|
# .idea/compiler.xml
|
||||||
|
# .idea/jarRepositories.xml
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
# *.iml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# SonarLint plugin
|
||||||
|
.idea/sonarlint/
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
|
### Intellij Patch ###
|
||||||
|
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||||
|
|
||||||
|
# *.iml
|
||||||
|
# modules.xml
|
||||||
|
# .idea/misc.xml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# Sonarlint plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/7973-sonarlint
|
||||||
|
.idea/**/sonarlint/
|
||||||
|
|
||||||
|
# SonarQube Plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
|
||||||
|
.idea/**/sonarIssues.xml
|
||||||
|
|
||||||
|
# Markdown Navigator plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
|
||||||
|
.idea/**/markdown-navigator.xml
|
||||||
|
.idea/**/markdown-navigator-enh.xml
|
||||||
|
.idea/**/markdown-navigator/
|
||||||
|
|
||||||
|
# Cache file creation bug
|
||||||
|
# See https://youtrack.jetbrains.com/issue/JBR-2257
|
||||||
|
.idea/$CACHE_FILE$
|
||||||
|
|
||||||
|
# CodeStream plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/12206-codestream
|
||||||
|
.idea/codestream.xml
|
||||||
|
|
||||||
|
# Azure Toolkit for IntelliJ plugin
|
||||||
|
# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
|
||||||
|
.idea/**/azureSettings.xml
|
||||||
|
|
||||||
|
### macOS ###
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
### macOS Patch ###
|
||||||
|
# iCloud generated files
|
||||||
|
*.icloud
|
||||||
|
|
||||||
|
### Windows ###
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/intellij,windows,macos,git
|
6
.idea/sqldialects.xml
generated
6
.idea/sqldialects.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="SqlDialectMappings">
|
|
||||||
<file url="file://$PROJECT_DIR$/contact.sql" dialect="GenericSQL" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
385
CSS/style.css
385
CSS/style.css
@@ -4,22 +4,9 @@ body {
|
|||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
min-height: 100vh;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
width: 100vw;
|
|
||||||
max-width: 100vw;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
}
|
||||||
#wrapper {
|
#wrapper {
|
||||||
flex: 1 0 auto;
|
|
||||||
min-height: 0;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: flex-start;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
width: 100vw;
|
|
||||||
max-width: 100vw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@@ -29,11 +16,6 @@ a {
|
|||||||
#navigation {
|
#navigation {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
|
||||||
z-index: 1000;
|
|
||||||
background: #BAC8D4;
|
|
||||||
width: 100vw;
|
|
||||||
}
|
}
|
||||||
.link-container {
|
.link-container {
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -56,19 +38,17 @@ a {
|
|||||||
background-size: contain;
|
background-size: contain;
|
||||||
}
|
}
|
||||||
#footer {
|
#footer {
|
||||||
position: relative;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100vw;
|
width: 100%;
|
||||||
height: 180px;
|
height: 240px;
|
||||||
background-color: #BAC8D4;
|
background-color: #BAC8D4;
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
display: grid;
|
||||||
|
grid-template-columns: 6% 5% 43% 32% 14%;
|
||||||
|
grid-template-rows: 45% 10% 45%;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
|
||||||
flex-shrink: 0;
|
|
||||||
z-index: 999;
|
|
||||||
padding: 10px 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.container-zahlungsmittel {
|
.container-zahlungsmittel {
|
||||||
@@ -81,16 +61,11 @@ a {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.inhalt {
|
.inhalt {
|
||||||
flex: 1 1 auto;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
height: 10px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
width: 100vw;
|
width: 100%;
|
||||||
min-height: 0;
|
|
||||||
min-width: 0;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0 2vw;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.zahlungsmittel-img {
|
.zahlungsmittel-img {
|
||||||
@@ -127,251 +102,141 @@ a {
|
|||||||
padding-right: 30px;
|
padding-right: 30px;
|
||||||
}
|
}
|
||||||
.container-welcome-inhalt {
|
.container-welcome-inhalt {
|
||||||
|
grid-template-columns: 39% 61%;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr;
|
width: 110em;
|
||||||
width: 100%;
|
min-height: 80%;
|
||||||
max-width: 900px;
|
|
||||||
min-height: 200px;
|
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: white;
|
|
||||||
box-shadow: 0 2px 16px rgba(0,0,0,0.08);
|
|
||||||
justify-items: center;
|
|
||||||
align-items: center;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 10px 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.beispiel-austellung1-img, .beispiel-austellung2-img {
|
.beispiel-austellung1-img {
|
||||||
height: 200px;
|
height: 480px;
|
||||||
width: 90vw;
|
width: 670px;
|
||||||
max-width: 320px;
|
background-image: url("../images/beispiel-austellung1.png");
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-size: contain;
|
background-size: contain;
|
||||||
|
justify-self: right;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
}
|
}
|
||||||
|
.beispiel-austellung2-img {
|
||||||
|
background-image: url("../images/beispiel-austellung2.png");
|
||||||
|
background-position: center;
|
||||||
|
background-size: contain;
|
||||||
|
justify-self: right;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Login Page Styles */
|
||||||
|
.login-page-bg {
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: linear-gradient(135deg, #DFF0F2 60%, #BAC8D4 100%);
|
||||||
|
}
|
||||||
|
|
||||||
.login-container {
|
.login-container {
|
||||||
position: absolute;
|
background: #fff;
|
||||||
top: 200px;
|
box-shadow: 0 4px 24px rgba(0,0,0,0.10);
|
||||||
background-color: #BAC8D4;
|
border-radius: 16px;
|
||||||
width: 900px;
|
padding: 40px 32px 32px 32px;
|
||||||
height: 450px;
|
width: 100%;
|
||||||
border-radius: 10px;
|
max-width: 400px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tickets-container {
|
.login-title {
|
||||||
position: absolute;
|
margin-bottom: 24px;
|
||||||
top: 200px;
|
color: #4d4d4d;
|
||||||
background-color: #BAC8D4;
|
font-size: 2rem;
|
||||||
width: 900px;
|
font-weight: 600;
|
||||||
height: 450px;
|
letter-spacing: 1px;
|
||||||
border-radius: 10px;
|
}
|
||||||
|
|
||||||
|
.login-form {
|
||||||
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
gap: 18px;
|
||||||
justify-content: center;
|
}
|
||||||
box-sizing: border-box;
|
|
||||||
|
.login-field {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-field label {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #4d4d4d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-field input {
|
||||||
|
padding: 10px 12px;
|
||||||
|
border: 1px solid #BAC8D4;
|
||||||
|
border-radius: 6px;
|
||||||
|
font-size: 1rem;
|
||||||
|
background: #F7FAFC;
|
||||||
|
transition: border 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-field input:focus {
|
||||||
|
border: 1.5px solid #09add0;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-btn {
|
||||||
|
margin-top: 10px;
|
||||||
|
padding: 12px 0;
|
||||||
|
background: #09add0;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
border-radius: 6px;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-btn:hover {
|
||||||
|
background: #007b9e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-error {
|
||||||
|
background: #ffe0e0;
|
||||||
|
color: #b30000;
|
||||||
|
border: 1px solid #ffb3b3;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 10px 16px;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-success {
|
||||||
|
background: #e0ffe6;
|
||||||
|
color: #006633;
|
||||||
|
border: 1px solid #b3ffd1;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 10px 16px;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-link {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 10px;
|
||||||
|
color: #09add0;
|
||||||
|
font-weight: 500;
|
||||||
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 600px) {
|
@media (max-width: 600px) {
|
||||||
body {
|
|
||||||
font-size: 14px;
|
|
||||||
width: 100vw;
|
|
||||||
max-width: 100vw;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
|
||||||
#wrapper {
|
|
||||||
width: 100vw;
|
|
||||||
max-width: 100vw;
|
|
||||||
}
|
|
||||||
#navigation {
|
|
||||||
width: 100vw;
|
|
||||||
min-width: 0;
|
|
||||||
padding: 0;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.link-container {
|
|
||||||
width: 100vw;
|
|
||||||
min-width: 0;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
row-gap: 8px;
|
|
||||||
border-radius: 0;
|
|
||||||
padding: 0 4px;
|
|
||||||
}
|
|
||||||
.links {
|
|
||||||
font-size: 18px;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
padding: 6px 0;
|
|
||||||
text-align: center;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
#logo {
|
|
||||||
width: 120px;
|
|
||||||
height: 40px;
|
|
||||||
margin: 0 auto 8px auto;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.container-welcome-inhalt {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
width: 100vw;
|
|
||||||
max-width: 100vw;
|
|
||||||
min-height: 0;
|
|
||||||
padding: 8px 0;
|
|
||||||
}
|
|
||||||
.beispiel-austellung1-img, .beispiel-austellung2-img {
|
|
||||||
width: 90vw;
|
|
||||||
max-width: 98vw;
|
|
||||||
height: 120px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
.inhalt {
|
|
||||||
width: 100vw;
|
|
||||||
min-width: 0;
|
|
||||||
max-width: 100vw;
|
|
||||||
padding: 0 2vw;
|
|
||||||
box-sizing: border-box;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: stretch;
|
|
||||||
}
|
|
||||||
#footer {
|
|
||||||
width: 100vw;
|
|
||||||
height: auto;
|
|
||||||
min-height: 120px;
|
|
||||||
padding: 10px 0 10px 0;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
.container-zahlungsmittel {
|
|
||||||
width: 100vw;
|
|
||||||
text-align: center;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.header-zahlungsarten {
|
|
||||||
font-size: 1.1em;
|
|
||||||
padding-right: 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.zahlungsmittel-img {
|
|
||||||
width: 90vw;
|
|
||||||
max-width: 200px;
|
|
||||||
height: 30px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.line {
|
|
||||||
width: 95vw;
|
|
||||||
}
|
|
||||||
.link-impressum, .link-datenschutz, .link-nutzungsbedingungen {
|
|
||||||
display: block;
|
|
||||||
padding: 2px 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.text-bib {
|
|
||||||
display: block;
|
|
||||||
text-align: center;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.desktop-only {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
.mobile-only {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
.login-container {
|
.login-container {
|
||||||
position: static;
|
padding: 24px 8px;
|
||||||
width: 95vw;
|
max-width: 95vw;
|
||||||
max-width: 400px;
|
|
||||||
height: auto;
|
|
||||||
margin: 24px auto;
|
|
||||||
padding: 16px 8px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.tickets-container {
|
|
||||||
position: static;
|
|
||||||
width: 95vw;
|
|
||||||
max-width: 400px;
|
|
||||||
height: auto;
|
|
||||||
margin: 24px auto;
|
|
||||||
padding: 16px 8px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.login-container h1 {
|
|
||||||
font-size: 1.5em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.tickets-container h1 {
|
|
||||||
font-size: 1.5em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.login-container form,
|
|
||||||
.login-container label,
|
|
||||||
.login-container input {
|
|
||||||
width: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.login-container button,
|
|
||||||
.login-container a {
|
|
||||||
width: 100%;
|
|
||||||
max-width: 100%;
|
|
||||||
margin-top: 8px;
|
|
||||||
text-align: center;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
#nav-toggle-btn {
|
|
||||||
display: block;
|
|
||||||
background: none;
|
|
||||||
border: none;
|
|
||||||
font-size: 2em;
|
|
||||||
cursor: pointer;
|
|
||||||
margin: 0 auto 8px auto;
|
|
||||||
transition: transform 0.2s;
|
|
||||||
}
|
|
||||||
.nav-links {
|
|
||||||
display: none;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
width: 100%;
|
|
||||||
transition: max-height 0.3s ease;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.nav-links.open {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
#nav-toggle-btn.open {
|
|
||||||
transform: rotate(180deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 601px) {
|
|
||||||
.mobile-only {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
.desktop-only {
|
|
||||||
display: block !important;
|
|
||||||
}
|
|
||||||
#nav-toggle-btn {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.nav-links {
|
|
||||||
display: flex !important;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
width: auto;
|
|
||||||
gap: 32px;
|
|
||||||
}
|
|
||||||
.nav-links .links {
|
|
||||||
margin: 0 12px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
170
Controller/AuthController.php
Normal file
170
Controller/AuthController.php
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Controller;
|
||||||
|
|
||||||
|
use Blog\Model\AuthModel;
|
||||||
|
|
||||||
|
class AuthController
|
||||||
|
{
|
||||||
|
private $model;
|
||||||
|
private $view;
|
||||||
|
|
||||||
|
public function __construct($view)
|
||||||
|
{
|
||||||
|
$this->model = new AuthModel();
|
||||||
|
$this->view = $view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showAuthForm()
|
||||||
|
{
|
||||||
|
$this->view->setVars([
|
||||||
|
'labels' => [
|
||||||
|
"email" => "E-Mail-Adresse",
|
||||||
|
"password" => "Passwort",
|
||||||
|
"password_repeat" => "Passwort wiederholen",
|
||||||
|
"old_password" => "Altes Passwort"
|
||||||
|
],
|
||||||
|
'errors' => $_SESSION['auth_errors'] ?? [],
|
||||||
|
'validData' => $_SESSION['auth_validData'] ?? []
|
||||||
|
]);
|
||||||
|
unset($_SESSION['auth_errors'], $_SESSION['auth_validData']);
|
||||||
|
$this->view->render('auth/form');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function login() {
|
||||||
|
$email = $_POST['email'];
|
||||||
|
$password = $_POST['password'];
|
||||||
|
|
||||||
|
$result = $this->model->login($email, $password);
|
||||||
|
|
||||||
|
if ($result === true) {
|
||||||
|
$_SESSION['user'] = $email;
|
||||||
|
|
||||||
|
$this->view->setVars([
|
||||||
|
'loginSuccess' => true,
|
||||||
|
'email' => $email
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
$this->view->setVars([
|
||||||
|
'errors' => ['login' => is_string($result) ? $result : "Login fehlgeschlagen."],
|
||||||
|
'validData' => ['email' => $email],
|
||||||
|
'loginSuccess' => false
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register() {
|
||||||
|
$data = [
|
||||||
|
'vorname' => $_POST['vorname'] ?? '',
|
||||||
|
'nachname' => $_POST['nachname'] ?? '',
|
||||||
|
'straße' => $_POST['straße'] ?? '',
|
||||||
|
'hausnr' => $_POST['hausnr'] ?? '',
|
||||||
|
'postleitzahl' => $_POST['postleitzahl'] ?? '',
|
||||||
|
'ort' => $_POST['ort'] ?? '',
|
||||||
|
'land' => $_POST['land'] ?? '',
|
||||||
|
'tel' => $_POST['tel'] ?? '',
|
||||||
|
'email' => $_POST['email'] ?? '',
|
||||||
|
'password' => $_POST['password'] ?? '',
|
||||||
|
'password_repeat' => $_POST['password_repeat'] ?? '',
|
||||||
|
'isAdmin' => $_POST['isAdmin'] ?? false,
|
||||||
|
];
|
||||||
|
|
||||||
|
$errors = [];
|
||||||
|
|
||||||
|
if (!$this->model->checkDoublePw($data['password'], $data['password_repeat'])) {
|
||||||
|
$errors['password'] = "Passwörter stimmen nicht überein.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->pwRequirementCheck($data['password'])) {
|
||||||
|
$errors['password'] = "Passwort muss mindestens 8 Zeichen lang sein und mindestens ein Großbuchstabe, ein Kleinbuchstabe, eine Zahl und ein Sonderzeichen enthalten.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
|
$result = $this->model->register($data);
|
||||||
|
|
||||||
|
if ($result === true) {
|
||||||
|
$this->view->setVars([
|
||||||
|
'success' => "Registrierung war erfolgreich."
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
$errors['register'] = is_string($result) ? $result : "Registrierung fehlgeschlagen.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->view->setVars([
|
||||||
|
'errors' => $errors,
|
||||||
|
'validData' => $data
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function pwRequirementCheck($password){
|
||||||
|
$error = [];
|
||||||
|
|
||||||
|
if(strlen($password) <= 8)
|
||||||
|
$error[] = "min 8 Charackter";
|
||||||
|
if(!preg_match("/[A-Z]/", $password))
|
||||||
|
$error[] = "min one large Character";
|
||||||
|
if(!preg_match("/[a-z]/", $password))
|
||||||
|
$error[] = "min one small charakter";
|
||||||
|
if(!preg_match("/[0-9]/", $password))
|
||||||
|
$error[] = "min one number";
|
||||||
|
if(!preg_match("[^a-zA-Z0-9\s]", $password));
|
||||||
|
$error[] = "min one special character";
|
||||||
|
|
||||||
|
if(empty($error))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return $error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function forgotPassword() {
|
||||||
|
$email = $_POST['email'] ?? '';
|
||||||
|
if (empty($email)) {
|
||||||
|
$_SESSION['auth_errors']['email'] = "Bitte E-Mail-Adresse angeben.";
|
||||||
|
header("Location: /?controller=Auth&do=showAuthForm");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
$this->model->pwForgot($email);
|
||||||
|
header("Location: /?controller=Auth&do=showConfirmation&msg=pwforgot");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function changePassword()
|
||||||
|
{
|
||||||
|
$email = $_POST['email'] ?? '';
|
||||||
|
$oldpw = $_POST['old_password'] ?? '';
|
||||||
|
$newpw = $_POST['password'] ?? '';
|
||||||
|
$repeat = $_POST['password_repeat'] ?? '';
|
||||||
|
|
||||||
|
if (!$this->model->checkDoublePw($newpw, $repeat)) {
|
||||||
|
$_SESSION['auth_errors']['password'] = "Neue Passwörter stimmen nicht überein.";
|
||||||
|
header("Location: /?controller=Auth&do=showAuthForm");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->model->updatePassword($email, $oldpw, $newpw);
|
||||||
|
|
||||||
|
if ($result === true) {
|
||||||
|
header("Location: /?controller=Auth&do=showConfirmation&msg=pwchange");
|
||||||
|
exit;
|
||||||
|
} else {
|
||||||
|
$_SESSION['auth_errors']['password'] = is_string($result) ? $result : "Fehler beim Aktualisieren des Passworts.";
|
||||||
|
header("Location: /?controller=Auth&do=showAuthForm");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showConfirmation()
|
||||||
|
{
|
||||||
|
$messages = [
|
||||||
|
'login' => "Login erfolgreich.",
|
||||||
|
'register' => "Registrierung erfolgreich.",
|
||||||
|
'pwforgot' => "Ein temporäres Passwort wurde an Ihre E-Mail gesendet.",
|
||||||
|
'pwchange' => "Passwort erfolgreich geändert."
|
||||||
|
];
|
||||||
|
$msgKey = $_GET['msg'] ?? '';
|
||||||
|
$message = $messages[$msgKey] ?? "Aktion erfolgreich.";
|
||||||
|
$this->view->setVars(['message' => $message]);
|
||||||
|
$this->view->render('auth/confirmation');
|
||||||
|
}
|
||||||
|
}
|
@@ -1,56 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Blog\Controller;
|
|
||||||
|
|
||||||
use Blog\Model\ContactModel;
|
|
||||||
|
|
||||||
class ContactController
|
|
||||||
{
|
|
||||||
protected $view;
|
|
||||||
private $db;
|
|
||||||
private $validData = array();
|
|
||||||
private $errors = array();
|
|
||||||
private $labels = array("name" => "Name", "email" => "E-Mail-Adresse", "content" => "Nachricht");
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct($view)
|
|
||||||
{
|
|
||||||
$this->db = new ContactModel();
|
|
||||||
$this->view = $view;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function showContactForm()
|
|
||||||
{
|
|
||||||
$this->view->setVars([
|
|
||||||
'labels' => $this->labels,
|
|
||||||
'validData' => $this->validData,
|
|
||||||
'errors' => $this->errors
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function showConfirmation()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function validateForm(){
|
|
||||||
foreach ($this->labels as $index => $value) {
|
|
||||||
if (!isset($_POST[$index]) || empty($_POST[$index])) {
|
|
||||||
$this->errors[$index] = "Bitte " . $value . " angeben";
|
|
||||||
} else {
|
|
||||||
$this->validData[$index] = $_POST[$index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($this->errors) > 0) {
|
|
||||||
$this->view->setDoMethodName("showContactForm");
|
|
||||||
$this->showContactForm();
|
|
||||||
} else {
|
|
||||||
if ($this->db->writeContactData($this->validData)) {
|
|
||||||
$this->view->setDoMethodName("showConfirmation");
|
|
||||||
$this->showConfirmation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
|
64
Controller/EventController.php
Normal file
64
Controller/EventController.php
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Controller;
|
||||||
|
|
||||||
|
use Blog\Model\EventModel;
|
||||||
|
|
||||||
|
class EventController {
|
||||||
|
|
||||||
|
private $model;
|
||||||
|
private $view;
|
||||||
|
|
||||||
|
public function __construct($view) {
|
||||||
|
$this->model = new EventModel();
|
||||||
|
$this->view = $view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showEvents() {
|
||||||
|
$events = $this->model->getEvents();
|
||||||
|
$this->view->setVars([
|
||||||
|
'events' => $events
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createEvent() {
|
||||||
|
$data = [
|
||||||
|
'name' => $_POST['name'] ?? null,
|
||||||
|
'beschreibung' => $_POST['beschreibung'] ?? null,
|
||||||
|
'standortid' => $_POST['standortid'] ?? null,
|
||||||
|
'datum_von' => $_POST['datum_von'] ?? null,
|
||||||
|
'datum_bis' => $_POST['datum_bis'] ?? null,
|
||||||
|
'max_tickets' => $_POST['max_tickets'] ?? null,
|
||||||
|
'preis' => $_POST['preis'] ?? null
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->model->createEvent($data);
|
||||||
|
$this->view->setVars(['event' => $data]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function editEventForm() {
|
||||||
|
$id = $_GET['ausstellungid'];
|
||||||
|
$event = $this->model->getEvent($id);
|
||||||
|
$this->view->setVars(['event' => $event]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateEvent($id, $data) {
|
||||||
|
$id = $_POST['ausstellungid'];
|
||||||
|
$data = [
|
||||||
|
'standortid' => $_POST['standortid'] ?? null,
|
||||||
|
'datum_von' => $_POST['datum_von'] ?? null,
|
||||||
|
'datum_bis' => $_POST['datum_bis'] ?? null,
|
||||||
|
'name' => $_POST['name'] ?? null,
|
||||||
|
'beschreibung' => $_POST['beschreibung'] ?? null,
|
||||||
|
'max_tickets' => $_POST['max_tickets'] ?? null,
|
||||||
|
'preis' => $_POST['preis'] ?? null
|
||||||
|
];
|
||||||
|
$this->model->updateEvent($id, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteEvent($id) {
|
||||||
|
$this->model->deleteEvent($id);
|
||||||
|
$this->view->setVars(['id' => $id]);
|
||||||
|
}
|
||||||
|
}
|
57
Controller/GutscheinController.php
Normal file
57
Controller/GutscheinController.php
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Controller;
|
||||||
|
|
||||||
|
use Blog\Model\GutscheinModel;
|
||||||
|
|
||||||
|
class GutscheinController {
|
||||||
|
|
||||||
|
private $model;
|
||||||
|
private $view;
|
||||||
|
|
||||||
|
public function __construct($view) {
|
||||||
|
$this->model = new GutscheinModel();
|
||||||
|
$this->view = $view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showGutscheine() {
|
||||||
|
$gutscheine = $this->model->getGutscheine();
|
||||||
|
$this->view->setVars(['gutscheine' => $gutscheine]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createGutschein() {
|
||||||
|
$data = [
|
||||||
|
'code' => $_POST['code'] ?? null,
|
||||||
|
'rabatt' => $_POST['rabatt'] ?? null,
|
||||||
|
'ausstellungid' => $_POST['ausstellungid'] ?? null,
|
||||||
|
'gueltigkeit' => $_POST['gueltigkeit'] ?? null
|
||||||
|
];
|
||||||
|
$erg = $this->model->createGutschein($data);
|
||||||
|
$this->view->setVars(['gutschein' => $erg]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function editGutscheinForm() {
|
||||||
|
$id = $_GET['gutscheinid'];
|
||||||
|
if ($id) {
|
||||||
|
$gutschein = $this->model->getGutschein($id);
|
||||||
|
$this->view->setVars(['gutschein' => $gutschein]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateGutschein() {
|
||||||
|
$id = $_POST['gutscheinid'];
|
||||||
|
$data = [
|
||||||
|
'code' => $_POST['code'] ?? null,
|
||||||
|
'rabatt' => $_POST['rabatt'] ?? null,
|
||||||
|
'ausstellungid' => $_POST['ausstellungid'] ?? null,
|
||||||
|
'gueltigkeit' => $_POST['gueltigkeit'] ?? null
|
||||||
|
];
|
||||||
|
$this->model->updateGutschein($id, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteGutschein() {
|
||||||
|
$id = $_GET['gutscheinid'] ?? null;
|
||||||
|
$this->model->deleteGutschein($id);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,12 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Blog\Controller;
|
|
||||||
|
|
||||||
class LoginController {
|
|
||||||
function showLoginPage(){
|
|
||||||
|
|
||||||
}
|
|
||||||
function showPasswortVergessen(){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
53
Controller/NewsController.php
Normal file
53
Controller/NewsController.php
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Controller;
|
||||||
|
|
||||||
|
use Blog\Model\NewsModel;
|
||||||
|
|
||||||
|
class NewsController {
|
||||||
|
|
||||||
|
private $model;
|
||||||
|
private $view;
|
||||||
|
|
||||||
|
public function __construct($view) {
|
||||||
|
$this->model = new NewsModel();
|
||||||
|
$this->view = $view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showNews() {
|
||||||
|
$news = $this->model->getNews();
|
||||||
|
$this->view->setVars(['news' => $news]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createNews() {
|
||||||
|
$data = [
|
||||||
|
'name' => $_POST['name'],
|
||||||
|
'beschreibung' => $_POST['beschreibung'],
|
||||||
|
'datum' => $_POST['datum'],
|
||||||
|
];
|
||||||
|
$erg = $this->model->createNews($data);
|
||||||
|
$this->view->setVars(['news' => $erg]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function editNewsForm() {
|
||||||
|
$id = $_GET['newsid'];
|
||||||
|
$news = $this->model->getNewsById($id);
|
||||||
|
$this->view->setVars(['news' => $news]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateNews() {
|
||||||
|
$id = $_POST['newsid'] ?? null;
|
||||||
|
$data = [
|
||||||
|
'name' => $_POST['name'],
|
||||||
|
'beschreibung' => $_POST['beschreibung'],
|
||||||
|
'datum' => $_POST['datum'],
|
||||||
|
];
|
||||||
|
$this->model->updateNews($id, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteNews() {
|
||||||
|
$id = $_GET['newsid'] ?? null;
|
||||||
|
$this->model->deleteNews($id);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,10 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Blog\Controller;
|
|
||||||
|
|
||||||
class ProfileController {
|
|
||||||
function showProfile()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
61
Controller/StandortController.php
Normal file
61
Controller/StandortController.php
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Controller;
|
||||||
|
|
||||||
|
use Blog\Model\StandortModel;
|
||||||
|
|
||||||
|
class StandortController {
|
||||||
|
|
||||||
|
private $model;
|
||||||
|
private $view;
|
||||||
|
|
||||||
|
public function __construct($view) {
|
||||||
|
$this->model = new StandortModel();
|
||||||
|
$this->view = $view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showStandorte() {
|
||||||
|
$standorte = $this->model->getStandorte();
|
||||||
|
$this->view->setVars(['standorte' => $standorte]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createStandort() {
|
||||||
|
$data = [
|
||||||
|
'strasse' => $_POST['strasse'],
|
||||||
|
'hausnr' => $_POST['hausnr'],
|
||||||
|
'plz' => $_POST['plz'],
|
||||||
|
'ort' => $_POST['ort'],
|
||||||
|
'land' => $_POST['land'],
|
||||||
|
'tel' => $_POST['tel'],
|
||||||
|
'email' => $_POST['email']
|
||||||
|
];
|
||||||
|
$erg = $this->model->createStandort($data);
|
||||||
|
$this->view->setVars(['standort' => $erg]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function editStandortForm() {
|
||||||
|
$id = $_GET['standortid'];
|
||||||
|
$standort = $this->model->getStandort($id);
|
||||||
|
$this->view->setVars(['standort' => $standort]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateStandort() {
|
||||||
|
$data = [
|
||||||
|
'strasse' => $_POST['strasse'],
|
||||||
|
'hausnr' => $_POST['hausnr'],
|
||||||
|
'plz' => $_POST['plz'],
|
||||||
|
'ort' => $_POST['ort'],
|
||||||
|
'land' => $_POST['land'],
|
||||||
|
'tel' => $_POST['tel'],
|
||||||
|
'email' => $_POST['email']
|
||||||
|
];
|
||||||
|
$standortid = $_POST['standortid'];
|
||||||
|
$erg = $this->model->updateStandort($standortid, $data);
|
||||||
|
$this->view->setVars(['standort' => $erg]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteStandort() {
|
||||||
|
$id = $_GET['standortid'] ?? null;
|
||||||
|
$this->model->deleteStandort($id);
|
||||||
|
}
|
||||||
|
}
|
39
Controller/TicketController.php
Normal file
39
Controller/TicketController.php
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Controller;
|
||||||
|
|
||||||
|
use Blog\Model\TicketModel;
|
||||||
|
|
||||||
|
class TicketController {
|
||||||
|
|
||||||
|
private $ticketModel;
|
||||||
|
private $view;
|
||||||
|
|
||||||
|
public function __construct($view) {
|
||||||
|
$this->ticketModel = new TicketModel();
|
||||||
|
$this->view = $view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function showTickets() {
|
||||||
|
$tickets = $this->ticketModel->getTickets();
|
||||||
|
$this->view->setVars(['tickets' => $tickets]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buyTicket() {
|
||||||
|
$data = [
|
||||||
|
'userid' => $_POST['userid'],
|
||||||
|
'ausstellungid' => $_POST['ausstellungid'],
|
||||||
|
'kaufdatum' => date('Y-m-d'),
|
||||||
|
'gueltigkeit' => $_POST['gueltigkeit']
|
||||||
|
];
|
||||||
|
$erg = $this->ticketModel->buyTicket($data);
|
||||||
|
$this->view->setVars(['ticket' => $erg]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteTicket() {
|
||||||
|
$ticketid = $_GET['ticketid'] ?? null;
|
||||||
|
if ($ticketid) {
|
||||||
|
$this->ticketModel->deleteTicket($ticketid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,10 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Blog\Controller;
|
|
||||||
|
|
||||||
class TicketsController {
|
|
||||||
function showTickets()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Blog\Controller;
|
|
||||||
|
|
||||||
class WelcomeController
|
|
||||||
{
|
|
||||||
function showWelcome() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function showProjects() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function showTutorials() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
216
Model/AuthModel.php
Normal file
216
Model/AuthModel.php
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Model;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
use PDO;
|
||||||
|
use PDOException;
|
||||||
|
|
||||||
|
class AuthModel extends Database
|
||||||
|
{
|
||||||
|
public function login(string $email, string $password)
|
||||||
|
{
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT email, password, validUntil FROM user WHERE email = :email";
|
||||||
|
$params = [":email" => $email];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
$user = $sth->fetch(PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Abrufen der Benutzerdaten.", $e);
|
||||||
|
return "Interner Datenbankfehler."; // Nur für Debug sichtbar machen, sonst besser allgemein halten
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$user) {
|
||||||
|
return "Benutzer mit dieser E-Mail wurde nicht gefunden.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!password_verify($password, $user['password'])) {
|
||||||
|
return "Das eingegebene Passwort ist falsch.";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$now = new DateTime();
|
||||||
|
$validUntil = new DateTime($user['validUntil']);
|
||||||
|
|
||||||
|
if ($now > $validUntil) {
|
||||||
|
return "Ihr Passwort ist abgelaufen. Bitte setzen Sie ein neues über \"Passwort vergessen\".";
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Verarbeiten des Gültigkeitsdatums.", $e);
|
||||||
|
return "Fehler bei der Passwortprüfung.";
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register($data)
|
||||||
|
{
|
||||||
|
$rtn = $this->pwRequirementCheck($data['password']);
|
||||||
|
if ($rtn !== true) {
|
||||||
|
return $rtn;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
|
||||||
|
return "Bitte geben Sie eine gültige E-Mail ein.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$requiredFields = [
|
||||||
|
'email', 'password', 'straße', 'hausnr', 'ort', 'postleitzahl',
|
||||||
|
'land', 'vorname', 'nachname', 'tel'
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($requiredFields as $field) {
|
||||||
|
if (empty($data[$field])) {
|
||||||
|
return "Bitte füllen Sie alle Felder aus.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->userExistsByEmail($data['email'])) {
|
||||||
|
return "Ein Account mit dieser E-Mail existiert bereits.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$hashedPassword = password_hash($data['password'], PASSWORD_DEFAULT);
|
||||||
|
|
||||||
|
$sql = "INSERT INTO user (email, password, straße, hausnr, ort, postleitzahl, land,vorname, nachname, tel, isAdmin)
|
||||||
|
VALUES (:email, :password, :straße, :hausnr, :ort, :postleitzahl, :land,:vorname, :nachname, :tel, :isAdmin)";
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
':email' => $data['email'],
|
||||||
|
':password' => $hashedPassword,
|
||||||
|
':straße' => $data['straße'],
|
||||||
|
':hausnr' => $data['hausnr'],
|
||||||
|
':ort' => $data['ort'],
|
||||||
|
':postleitzahl'=> $data['postleitzahl'],
|
||||||
|
':land'=> $data['land'],
|
||||||
|
':vorname' => $data['vorname'],
|
||||||
|
':nachname'=> $data['nachname'],
|
||||||
|
':tel' => $data['tel'],
|
||||||
|
':isAdmin' => $data['isAdmin'] ? 1 : 0,
|
||||||
|
];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$stmt = $pdo->prepare($sql);
|
||||||
|
$stmt->execute($params);
|
||||||
|
return true;
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Schreiben der Daten.", $e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function userExistsByEmail($email) {
|
||||||
|
try {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
|
||||||
|
$sql = "SELECT userid FROM user WHERE email = :email";
|
||||||
|
$params = [':email' => $email];
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare($sql);
|
||||||
|
$stmt->execute($params);
|
||||||
|
|
||||||
|
return (bool) $stmt->fetch();
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler bei der E-Mail-Prüfung", $e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function pwForgot($email){
|
||||||
|
$randomPw = bin2hex(random_bytes(12 / 2));
|
||||||
|
$hashedPassword = password_hash($randomPw, PASSWORD_DEFAULT);
|
||||||
|
|
||||||
|
$this->forgottenPwUpdate($email, $hashedPassword);
|
||||||
|
|
||||||
|
$betreff = "Passwort zurücksetzen bei bibArts";
|
||||||
|
$nachricht = "Hallo,\n\nhier ihr temporäres Passwort:\n\n $randomPw \n\n Bitte beachten Sie, dass das Passwort nur 2 stunden Gülltig ist. \nViele Grüße,\nbibArts Team";
|
||||||
|
|
||||||
|
$header = "From: noreply@edu.bib.de\r\n";
|
||||||
|
$header .= "Content-Type: text/plain; charset=UTF-8\r\n";
|
||||||
|
|
||||||
|
$maxTries = 5;
|
||||||
|
$try = 0;
|
||||||
|
$success = false;
|
||||||
|
|
||||||
|
while ($try < $maxTries && !$success) {
|
||||||
|
$erfolg = mail($email, $betreff, $nachricht, $header);
|
||||||
|
$try++;
|
||||||
|
if (!$erfolg) {
|
||||||
|
error_log("Mailversuch $try an $email fehlgeschlagen.");
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function forgottenPwUpdate($email, $hashedPassword)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
|
||||||
|
$sqlCheck = "SELECT COUNT(*) FROM user WHERE email = :email";
|
||||||
|
$stmt = $pdo->prepare($sqlCheck);
|
||||||
|
$stmt->execute([':email' => $email]);
|
||||||
|
if ($stmt->fetchColumn() == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$validUntil = (new DateTime())->add(new DateInterval('PT2H'))->format('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
|
||||||
|
$sql = "UPDATE user
|
||||||
|
SET password = :password, validUntil = :validUntil
|
||||||
|
WHERE email = :email";
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare($sql);
|
||||||
|
return $stmt->execute([
|
||||||
|
':email' => $email,
|
||||||
|
':password' => $hashedPassword,
|
||||||
|
':validUntil' => $validUntil
|
||||||
|
]);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren der Daten.", $e);
|
||||||
|
die;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updatePassword($email, $oldpw, $newpw){
|
||||||
|
if(!$this->login($email, $oldpw)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$requiredFields = [$email, $oldpw, $newpw];
|
||||||
|
foreach ($requiredFields as $field) {
|
||||||
|
if (empty($field)) {
|
||||||
|
return "Bitte füllen Sie alle Felder aus";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$hashedPassword = password_hash($newpw, PASSWORD_DEFAULT);
|
||||||
|
|
||||||
|
$sql = "INSERT INTO user (email, password)
|
||||||
|
VALUES (:email, :password)";
|
||||||
|
|
||||||
|
try{
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$stmt = $pdo->prepare($sql);
|
||||||
|
return $stmt->execute([
|
||||||
|
':email' => $email,
|
||||||
|
':password' => $hashedPassword,
|
||||||
|
]);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Schreiben der Daten.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function checkDoublePw($password1, $password2){
|
||||||
|
if($password1 === $password2){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
90
Model/EventModel.php
Normal file
90
Model/EventModel.php
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Model;
|
||||||
|
|
||||||
|
use PDOException;
|
||||||
|
|
||||||
|
class EventModel extends Database {
|
||||||
|
|
||||||
|
public function getEvents() {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM ausstellung ORDER BY datum_von DESC;";
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute();
|
||||||
|
return $sth->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen der Events.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEvent($id) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM ausstellung WHERE ausstellungid = :id;";
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute([":id" => $id]);
|
||||||
|
return $sth->fetch(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen des Events.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateEvent($id, $data) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "UPDATE ausstellung SET standortid = :standortid, datum_von = :datum_von, datum_bis = :datum_bis, name = :name, beschreibung = :beschreibung, max_tickets = :max_tickets, preis = :preis WHERE ausstellungid = :id;";
|
||||||
|
$params = [
|
||||||
|
":standortid" => $data['standortid'],
|
||||||
|
":datum_von" => $data['datum_von'],
|
||||||
|
":datum_bis" => $data['datum_bis'],
|
||||||
|
":name" => $data['name'],
|
||||||
|
":beschreibung" => $data['beschreibung'],
|
||||||
|
":max_tickets" => $data['max_tickets'],
|
||||||
|
":preis" => $data['preis'],
|
||||||
|
":id" => $id
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren des Events.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createEvent($data) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "INSERT INTO ausstellung (standortid, datum_von, datum_bis, name, beschreibung, max_tickets, preis) VALUES (:standortid, :datum_von, :datum_bis, :name, :beschreibung, :max_tickets, :preis);";
|
||||||
|
$params = [
|
||||||
|
":standortid" => $data['standortid'],
|
||||||
|
":datum_von" => $data['datum_von'],
|
||||||
|
":datum_bis" => $data['datum_bis'],
|
||||||
|
":name" => $data['name'],
|
||||||
|
":beschreibung" => $data['beschreibung'],
|
||||||
|
":max_tickets" => $data['max_tickets'],
|
||||||
|
":preis" => $data['preis']
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth;
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Erstellen des Events.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteEvent($id) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "DELETE FROM ausstellung WHERE ausstellungid = :id;";
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute([":id" => $id]);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Löschen des Events.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
86
Model/GutscheinModel.php
Normal file
86
Model/GutscheinModel.php
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Model;
|
||||||
|
|
||||||
|
use PDOException;
|
||||||
|
|
||||||
|
class GutscheinModel extends Database {
|
||||||
|
|
||||||
|
public function getGutscheine() {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM gutschein ORDER BY gueltigkeit DESC;";
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute();
|
||||||
|
return $sth->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen der Gutscheine.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getGutschein($id) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM gutschein WHERE gutscheinid = :id;";
|
||||||
|
$params = [":id" => $id];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth->fetch(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen des Gutscheins.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createGutschein($data) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "INSERT INTO gutschein (code, rabatt, ausstellungid, gueltigkeit) VALUES (:code, :rabatt, :ausstellungid, :gueltigkeit);";
|
||||||
|
$params = [
|
||||||
|
":code" => $data['code'],
|
||||||
|
":rabatt" => $data['rabatt'],
|
||||||
|
":ausstellungid" => $data['ausstellungid'],
|
||||||
|
":gueltigkeit" => $data['gueltigkeit']
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth;
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Erstellen des Gutscheins.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateGutschein($id, $data) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "UPDATE gutschein SET code = :code, rabatt = :rabatt, ausstellungid = :ausstellungid, gueltigkeit = :gueltigkeit WHERE gutscheinid = :id;";
|
||||||
|
$params = [
|
||||||
|
":code" => $data['code'],
|
||||||
|
":rabatt" => $data['rabatt'],
|
||||||
|
":ausstellungid" => $data['ausstellungid'],
|
||||||
|
":gueltigkeit" => $data['gueltigkeit'],
|
||||||
|
":id" => $id
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren des Gutscheins.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteGutschein($id) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "DELETE FROM gutschein WHERE gutscheinid = :id;";
|
||||||
|
$params = [":id" => $id];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Löschen des Gutscheins.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
85
Model/NewsModel.php
Normal file
85
Model/NewsModel.php
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Model;
|
||||||
|
|
||||||
|
use PDOException;
|
||||||
|
|
||||||
|
class NewsModel extends Database {
|
||||||
|
|
||||||
|
public function getNewsById($newsId) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM news WHERE newsid = :newsid;";
|
||||||
|
$params = [":newsid" => $newsId];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth->fetch(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen der News.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateNews($newsId, $news) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "UPDATE news SET name = :name, beschreibung = :beschreibung, datum = :datum WHERE newsid = :newsid;";
|
||||||
|
$params = [
|
||||||
|
":name" => $news['titel'],
|
||||||
|
":beschreibung" => $news['inhalt'],
|
||||||
|
":datum" => $news['datum'],
|
||||||
|
":newsid" => $newsId
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth;
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren der News.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNews() {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM news ORDER BY datum DESC;";
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute();
|
||||||
|
return $sth->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen der News.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createNews($news) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "INSERT INTO news (name, beschreibung, datum) VALUES (:name, :beschreibung, :datum);";
|
||||||
|
$params = [
|
||||||
|
":name" => $news['titel'],
|
||||||
|
":beschreibung" => $news['inhalt'],
|
||||||
|
":datum" => $news['datum']
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth;
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Schreiben der News.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteNews($newsId) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "DELETE FROM news WHERE newsid = :newsid;";
|
||||||
|
$params = [":newsid" => $newsId];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Löschen der News.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
103
Model/StandortModel.php
Normal file
103
Model/StandortModel.php
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Model;
|
||||||
|
|
||||||
|
use PDOException;
|
||||||
|
|
||||||
|
class StandortModel extends Database {
|
||||||
|
|
||||||
|
public function getStandorte() {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM Standort ORDER BY standortid ASC;";
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute();
|
||||||
|
return $sth->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen der Standorte.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStandort($standortid) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM Standort WHERE standortid = :standortid;";
|
||||||
|
$params = [":standortid" => $standortid];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth->fetch(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen des Standorts.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createStandort($data) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "INSERT INTO Standort (strasse, hausnr, plz, ort, land, tel, email)
|
||||||
|
VALUES (:strasse, :hausnr, :plz, :ort, :land, :tel, :email);";
|
||||||
|
$params = [
|
||||||
|
":strasse" => $data['strasse'],
|
||||||
|
":hausnr" => $data['hausnr'],
|
||||||
|
":plz" => $data['plz'],
|
||||||
|
":ort" => $data['ort'],
|
||||||
|
":land" => $data['land'],
|
||||||
|
":tel" => $data['tel'],
|
||||||
|
":email" => $data['email']
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $pdo->lastInsertId();
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Anlegen des Standorts.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateStandort($standortid, $data) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "UPDATE Standort SET
|
||||||
|
strasse = :strasse,
|
||||||
|
hausnr = :hausnr,
|
||||||
|
plz = :plz,
|
||||||
|
ort = :ort,
|
||||||
|
land = :land,
|
||||||
|
tel = :tel,
|
||||||
|
email = :email
|
||||||
|
WHERE standortid = :standortid;";
|
||||||
|
$params = [
|
||||||
|
":strasse" => $data['strasse'],
|
||||||
|
":hausnr" => $data['hausnr'],
|
||||||
|
":plz" => $data['plz'],
|
||||||
|
":ort" => $data['ort'],
|
||||||
|
":land" => $data['land'],
|
||||||
|
":tel" => $data['tel'],
|
||||||
|
":email" => $data['email'],
|
||||||
|
":standortid" => $standortid
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth->rowCount();
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Aktualisieren des Standorts.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteStandort($standortid) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "DELETE FROM Standort WHERE standortid = :standortid;";
|
||||||
|
$params = [":standortid" => $standortid];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth->rowCount();
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Löschen des Standorts.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
72
Model/TicketModel.php
Normal file
72
Model/TicketModel.php
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Blog\Model;
|
||||||
|
|
||||||
|
use PDOException;
|
||||||
|
|
||||||
|
class TicketModel extends Database {
|
||||||
|
|
||||||
|
public function getTickets() {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT * FROM Ticket ORDER BY ticketid ASC;";
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute();
|
||||||
|
return $sth->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Lesen der Tickets.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buyTicket($data) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "INSERT INTO Ticket (userid, ausstellungid, kaufdatum, gueltigkeit)
|
||||||
|
VALUES (:userid, :ausstellungid, :kaufdatum, :gueltigkeit);";
|
||||||
|
$params = [
|
||||||
|
":userid" => $data['userid'],
|
||||||
|
":ausstellungid" => $data['ausstellungid'],
|
||||||
|
":kaufdatum" => $data['kaufdatum'],
|
||||||
|
":gueltigkeit" => $data['gueltigkeit']
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $pdo->lastInsertId();
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Kauf des Tickets.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasTicket($userid, $ausstellungid) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "SELECT COUNT(*) as count FROM Ticket WHERE userid = :userid AND ausstellungid = :ausstellungid;";
|
||||||
|
$params = [
|
||||||
|
":userid" => $userid,
|
||||||
|
":ausstellungid" => $ausstellungid
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth->fetch(\PDO::FETCH_ASSOC);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler bei der Ticketprüfung.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteTicket($ticketid) {
|
||||||
|
$pdo = $this->linkDB();
|
||||||
|
$sql = "DELETE FROM Ticket WHERE ticketid = :ticketid;";
|
||||||
|
$params = [":ticketid" => $ticketid];
|
||||||
|
try {
|
||||||
|
$sth = $pdo->prepare($sql);
|
||||||
|
$sth->execute($params);
|
||||||
|
return $sth->rowCount();
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
new \Blog\Library\ErrorMsg("Fehler beim Löschen des Tickets.", $e);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
Views/Auth/login.phtml
Normal file
35
Views/Auth/login.phtml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="login-page-bg">
|
||||||
|
<div class="login-container">
|
||||||
|
<h2 class="login-title">Login</h2>
|
||||||
|
<?php if (!empty($errors['login'])): ?>
|
||||||
|
<div class="login-error">
|
||||||
|
<?php echo htmlspecialchars($errors['login']); ?>
|
||||||
|
</div>
|
||||||
|
<?php elseif (!empty($loginSuccess)): ?>
|
||||||
|
<div class="login-success">
|
||||||
|
<p>Login für Benutzer <?php echo htmlspecialchars($_SESSION["user"]); ?> erfolgreich</p>
|
||||||
|
<a class="login-link" href="?controller=Welcome&do=showWelcome">Weiter</a>
|
||||||
|
</div>
|
||||||
|
<?php else: ?>
|
||||||
|
<form method="post" class="login-form">
|
||||||
|
<input type="hidden" name="controller" value="Auth">
|
||||||
|
<input type="hidden" name="do" value="login">
|
||||||
|
<div class="login-field">
|
||||||
|
<label for="email">E-Mail:</label>
|
||||||
|
<input type="email" name="email" id="email" value="<?= htmlspecialchars($validData['email'] ?? '') ?>">
|
||||||
|
</div>
|
||||||
|
<div class="login-field">
|
||||||
|
<label for="password">Passwort:</label>
|
||||||
|
<input type="password" name="password" id="password">
|
||||||
|
</div>
|
||||||
|
<button class="login-btn" type="submit">Einloggen</button>
|
||||||
|
</form>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php include dirname(__DIR__).'/footer.phtml'; ?>
|
61
Views/Auth/register.phtml
Normal file
61
Views/Auth/register.phtml
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<?php include dirname(__DIR__).'/header.phtml'; ?>
|
||||||
|
|
||||||
|
<?php if (!empty($success)) : ?>
|
||||||
|
<div class="success-message" style="color: green; margin-bottom: 1em;">
|
||||||
|
<p><?php echo htmlspecialchars($success); ?></p>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if (!empty($errors)) : ?>
|
||||||
|
<div class="error-messages" style="color: red; margin-bottom: 1em;">
|
||||||
|
<ul>
|
||||||
|
<?php foreach ($errors as $field => $error) : ?>
|
||||||
|
<li><?php echo htmlspecialchars($error); ?></li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<form action="?controller=Auth&do=register" method="post">
|
||||||
|
<label for="vorname">Vorname:</label>
|
||||||
|
<input type="text" name="vorname" id="vorname" value="<?php echo htmlspecialchars($validData['vorname'] ?? ''); ?>" required>
|
||||||
|
|
||||||
|
<label for="nachname">Nachname:</label>
|
||||||
|
<input type="text" name="nachname" id="nachname" value="<?php echo htmlspecialchars($validData['nachname'] ?? ''); ?>" required>
|
||||||
|
|
||||||
|
<label for="straße">Straße:</label>
|
||||||
|
<input type="text" name="straße" id="straße" value="<?php echo htmlspecialchars($validData['straße'] ?? ''); ?>" required>
|
||||||
|
|
||||||
|
<label for="hausnr">Hausnummer:</label>
|
||||||
|
<input type="text" name="hausnr" id="hausnr" value="<?php echo htmlspecialchars($validData['hausnr'] ?? ''); ?>" required>
|
||||||
|
|
||||||
|
<label for="postleitzahl">Postleitzahl:</label>
|
||||||
|
<input type="text" name="postleitzahl" id="postleitzahl" value="<?php echo htmlspecialchars($validData['postleitzahl'] ?? ''); ?>" required>
|
||||||
|
|
||||||
|
<label for="ort">Ort:</label>
|
||||||
|
<input type="text" name="ort" id="ort" value="<?php echo htmlspecialchars($validData['ort'] ?? ''); ?>" required>
|
||||||
|
|
||||||
|
<label for="land">Land:</label>
|
||||||
|
<input type="text" name="land" id="land" value="<?php echo htmlspecialchars($validData['land'] ?? ''); ?>" required>
|
||||||
|
|
||||||
|
<label for="tel">Telefonnummer:</label>
|
||||||
|
<input type="text" name="tel" id="tel" value="<?php echo htmlspecialchars($validData['tel'] ?? ''); ?>">
|
||||||
|
|
||||||
|
<label for="email">E-Mail-Adresse:</label>
|
||||||
|
<input type="email" name="email" id="email" value="<?php echo htmlspecialchars($validData['email'] ?? ''); ?>" required>
|
||||||
|
|
||||||
|
<label for="password">Passwort:</label>
|
||||||
|
<input type="password" name="password" id="password" required>
|
||||||
|
|
||||||
|
<label for="password_repeat">Passwort wiederholen:</label>
|
||||||
|
<input type="password" name="password_repeat" id="password_repeat" required>
|
||||||
|
|
||||||
|
<label for="isAdmin">
|
||||||
|
<input type="checkbox" name="isAdmin" id="isAdmin" value="1" <?php echo (!empty($validData['isAdmin'])) ? 'checked' : ''; ?>>
|
||||||
|
Admin-Rechte
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<button type="submit">Registrieren</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<?php include dirname(__DIR__).'/footer.phtml'; ?>
|
@@ -1,3 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__) . '/header.phtml';
|
||||||
|
?>
|
||||||
|
|
||||||
<div class="inhalt">
|
<div class="inhalt">
|
||||||
<div class="login-container">
|
<div class="login-container">
|
||||||
<h1>Anmelden</h1>
|
<h1>Anmelden</h1>
|
||||||
@@ -12,9 +16,12 @@
|
|||||||
</label>
|
</label>
|
||||||
</form>
|
</form>
|
||||||
<button class="button-loggin">Login</button>
|
<button class="button-loggin">Login</button>
|
||||||
<a class="link-passwort-vergessen" href="?controller=Login&do=showPasswortVergessen">Passwort vergessen?</a>
|
<a class="link-passwort-vergessen">Passwort vergessen?</a>
|
||||||
<a class="link-konto-erstellen" href="?controller=Register&do=showRegisterPage">Konto erstellen</a>
|
<a class="link-konto-erstellen">Konto erstellen</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__) . '/footer.phtml';
|
||||||
|
?>
|
||||||
|
|
12
Views/Event/createEvent.phtml
Normal file
12
Views/Event/createEvent.phtml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="msg">
|
||||||
|
<p>Das Event "<?php echo $name?>" wurde erfolgreich erstellt!</p>
|
||||||
|
<a href="?controller=Event&do=showEvents">Weiter</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
12
Views/Event/deleteEvent.phtml
Normal file
12
Views/Event/deleteEvent.phtml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="msg">
|
||||||
|
<p>Das Event mit der id"<?php echo $id?>" wurde erfolgreich gelöscht!</p>
|
||||||
|
<a href="?controller=Event&do=showEvents">Weiter</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
33
Views/Event/showEvents.phtml
Normal file
33
Views/Event/showEvents.phtml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
<h2>Alle Ausstellungen</h2>
|
||||||
|
<?php if (!empty($events)): ?>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Beschreibung</th>
|
||||||
|
<th>Von</th>
|
||||||
|
<th>Bis</th>
|
||||||
|
<th>Max. Tickets</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($events as $event): ?>
|
||||||
|
<tr>
|
||||||
|
<td><?php echo htmlspecialchars($event['name']); ?></td>
|
||||||
|
<td><?php echo nl2br(htmlspecialchars($event['beschreibung'])); ?></td>
|
||||||
|
<td><?php echo date('d.m.Y', strtotime($event['datum_von'])); ?></td>
|
||||||
|
<td><?php echo date('d.m.Y', strtotime($event['datum_bis'])); ?></td>
|
||||||
|
<td><?php echo (int) $event['max_tickets']; ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<?php else: ?>
|
||||||
|
<p>Derzeit sind keine Ausstellungen verfügbar.</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
12
Views/Event/updateEvent.phtml
Normal file
12
Views/Event/updateEvent.phtml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="msg">
|
||||||
|
<p>Das Event mit der ID "<?php echo $ausstellungid?>" wurde erfolgreich bearbeitet!</p>
|
||||||
|
<a href="?controller=Event&do=showEvents">Weiter</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
7
Views/Gutschein/createGutschein.phtml
Normal file
7
Views/Gutschein/createGutschein.phtml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
<!-- Gutschein-Erstellungsformular oder Inhalt hier einfügen -->
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
37
Views/Gutschein/showGutscheine.phtml
Normal file
37
Views/Gutschein/showGutscheine.phtml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
<h2>Alle Gutscheine</h2>
|
||||||
|
<a href="?controller=Gutschein&do=createGutscheinForm">Neuen Gutschein anlegen</a>
|
||||||
|
<?php if (!empty($gutscheine)): ?>
|
||||||
|
<table border="1" cellpadding="8" cellspacing="0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Code</th>
|
||||||
|
<th>Rabatt (%)</th>
|
||||||
|
<th>Event-ID</th>
|
||||||
|
<th>Gültig bis</th>
|
||||||
|
<th>Aktionen</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($gutscheine as $g): ?>
|
||||||
|
<tr>
|
||||||
|
<td><?php echo htmlspecialchars($g['code']); ?></td>
|
||||||
|
<td><?php echo (int)$g['rabatt']; ?></td>
|
||||||
|
<td><?php echo (int)$g['ausstellungid']; ?></td>
|
||||||
|
<td><?php echo htmlspecialchars($g['gueltigkeit']); ?></td>
|
||||||
|
<td>
|
||||||
|
<a href="?controller=Gutschein&action=editGutscheinForm&id=<?php echo $g['gutscheinid']; ?>">Bearbeiten</a> |
|
||||||
|
<a href="?controller=Gutschein&action=deleteGutschein&id=<?php echo $g['gutscheinid']; ?>" onclick="return confirm('Wirklich löschen?');">Löschen</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<?php else: ?>
|
||||||
|
<p>Keine Gutscheine vorhanden.</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
29
Views/News/showNews.phtml
Normal file
29
Views/News/showNews.phtml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
<h2>Alle News</h2>
|
||||||
|
<?php if (!empty($news)): ?>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Beschreibung</th>
|
||||||
|
<th>Datum</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($news as $item): ?>
|
||||||
|
<tr>
|
||||||
|
<td><?php echo htmlspecialchars($item['name']); ?></td>
|
||||||
|
<td><?php echo nl2br(htmlspecialchars($item['beschreibung'])); ?></td>
|
||||||
|
<td><?php echo date('d.m.Y', strtotime($item['datum'])); ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<?php else: ?>
|
||||||
|
<p>Derzeit sind keine News verfügbar.</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
@@ -1,3 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__) . '/header.phtml';
|
||||||
|
?>
|
||||||
<div class="inhalt">
|
<div class="inhalt">
|
||||||
<div class="login-container">
|
<div class="login-container">
|
||||||
<h1>Registrieren</h1>
|
<h1>Registrieren</h1>
|
||||||
@@ -57,8 +60,10 @@
|
|||||||
</label>
|
</label>
|
||||||
</form>
|
</form>
|
||||||
<button class="button-register">Registrieren</button>
|
<button class="button-register">Registrieren</button>
|
||||||
<a class="link-konto-erstellen" href="?controller=Login&do=showLoginPage">Login</a>
|
<a class="link-konto-erstellen">Login</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__) . '/footer.phtml';
|
||||||
|
?>
|
||||||
|
|
||||||
|
37
Views/Standort/showStandorte.phtml
Normal file
37
Views/Standort/showStandorte.phtml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
<h2>Unsere Standorte</h2>
|
||||||
|
<?php if (!empty($standorte)): ?>
|
||||||
|
<table border="1" cellpadding="8" cellspacing="0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Straße</th>
|
||||||
|
<th>Hausnr.</th>
|
||||||
|
<th>PLZ</th>
|
||||||
|
<th>Ort</th>
|
||||||
|
<th>Land</th>
|
||||||
|
<th>Telefon</th>
|
||||||
|
<th>Email</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($standorte as $standort): ?>
|
||||||
|
<tr>
|
||||||
|
<td><?php echo htmlspecialchars($standort['strasse']); ?></td>
|
||||||
|
<td><?php echo htmlspecialchars($standort['hausnr']); ?></td>
|
||||||
|
<td><?php echo htmlspecialchars($standort['plz']); ?></td>
|
||||||
|
<td><?php echo htmlspecialchars($standort['ort']); ?></td>
|
||||||
|
<td><?php echo htmlspecialchars($standort['land']); ?></td>
|
||||||
|
<td><?php echo htmlspecialchars($standort['tel']); ?></td>
|
||||||
|
<td><?php echo htmlspecialchars($standort['email']); ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<?php else: ?>
|
||||||
|
<p>Keine Standorte gefunden.</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
12
Views/Ticket/buyTicket.phtml
Normal file
12
Views/Ticket/buyTicket.phtml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/header.phtml';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="msg">
|
||||||
|
<p>Ihr Ticket für das Event "<?php echo $event['name']?>" wurde erfolgreich gekauft!</p>
|
||||||
|
<a href="?controller=Welcome&do=showWelcome">Weiter</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
include dirname(__DIR__).'/footer.phtml';
|
||||||
|
?>
|
@@ -1,8 +0,0 @@
|
|||||||
<div class="inhalt">
|
|
||||||
<div class="tickets-container">
|
|
||||||
<h1>Tickets</h1>
|
|
||||||
<div class="tickets-container-inhalt">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@@ -1,36 +1,20 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="HTML-5">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<title>VR Contact</title>
|
<title>VR Contact</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link href="CSS/style.css" rel="stylesheet" type="text/css" />
|
<link href="/bibarts/CSS/style.css" rel="stylesheet" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<nav id="navigation">
|
<div id="wrapper">
|
||||||
<div class="link-container">
|
<nav id="navigation">
|
||||||
<div id="logo" ><a class="link-logo" href="#"></a></div>
|
<div class="link-container">
|
||||||
<button id="nav-toggle-btn" aria-label="Menü ein-/ausklappen">▼</button>
|
<div id="logo" ><a class="link-logo" href="#"></a></div>
|
||||||
<div class="nav-links">
|
<a id="link-tickets" class="links" href="#">Tickets</a>
|
||||||
<a id="link-tickets" class="links" href="?controller=Tickets&do=showTickets">Tickets</a>
|
|
||||||
<a id="link-infos" class="links" href="?controller=Welcome&do=showWelcome">Infos</a>
|
<a id="link-infos" class="links" href="?controller=Welcome&do=showWelcome">Infos</a>
|
||||||
<a id="link-profil" class="links" href="?controller=Profile&do=showProfile">Profil</a>
|
<a id="link-profil" class="links" href="?controller=Contact&do=showContactForm">Profil</a>
|
||||||
<a id="link-login" class="links" href="?controller=Login&do=showLoginPage">Login</a>
|
|
||||||
<a id="link-register" class="links" href="?controller=Register&do=showRegisterPage">Register</a>
|
|
||||||
<div id="profile-picture"></div>
|
<div id="profile-picture"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</nav>
|
||||||
</nav>
|
</div>
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
var btn = document.getElementById('nav-toggle-btn');
|
|
||||||
var links = document.querySelector('.nav-links');
|
|
||||||
if (btn && links) {
|
|
||||||
btn.addEventListener('click', function() {
|
|
||||||
links.classList.toggle('open');
|
|
||||||
btn.classList.toggle('open');
|
|
||||||
btn.innerHTML = links.classList.contains('open') ? '▲' : '▼';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
144
bibarts.sql
Normal file
144
bibarts.sql
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||||
|
SET time_zone = "+00:00";
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE User (
|
||||||
|
userid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
vorname VARCHAR(50),
|
||||||
|
nachname VARCHAR(50),
|
||||||
|
strasse VARCHAR(100),
|
||||||
|
hausnr VARCHAR(10),
|
||||||
|
postleitzahl VARCHAR(10),
|
||||||
|
ort VARCHAR(50),
|
||||||
|
land VARCHAR(50),
|
||||||
|
tel VARCHAR(20),
|
||||||
|
email VARCHAR(100) UNIQUE,
|
||||||
|
isAdmin BOOLEAN DEFAULT FALSE,
|
||||||
|
password VARCHAR(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE Standort (
|
||||||
|
standortid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
strasse VARCHAR(100),
|
||||||
|
hausnr VARCHAR(10),
|
||||||
|
plz VARCHAR(10),
|
||||||
|
ort VARCHAR(50),
|
||||||
|
land VARCHAR(50),
|
||||||
|
tel VARCHAR(20),
|
||||||
|
email VARCHAR(100)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE Ausstellung (
|
||||||
|
austellungid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
standortid INT,
|
||||||
|
datum_von DATE,
|
||||||
|
datum_bis DATE,
|
||||||
|
name VARCHAR(100),
|
||||||
|
beschreibung TEXT,
|
||||||
|
max_tickets INT,
|
||||||
|
FOREIGN KEY (standortid) REFERENCES Standort(standortid)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE Ticket (
|
||||||
|
ticketid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
userid INT,
|
||||||
|
ausstellungid INT,
|
||||||
|
kaufdatum DATE,
|
||||||
|
gueltigkeit DATE,
|
||||||
|
preis DECIMAL(10,2),
|
||||||
|
FOREIGN KEY (userid) REFERENCES User(userid),
|
||||||
|
FOREIGN KEY (ausstellungid) REFERENCES Ausstellung(austellungid)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE Gutschein (
|
||||||
|
gutscheinid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
code VARCHAR(50) UNIQUE,
|
||||||
|
rabatt INT CHECK (rabatt BETWEEN 0 AND 100),
|
||||||
|
ausstellungid INT,
|
||||||
|
gueltigkeit DATE,
|
||||||
|
FOREIGN KEY (ausstellungid) REFERENCES Ausstellung(austellungid)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE News (
|
||||||
|
newsid INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
name VARCHAR(100),
|
||||||
|
beschreibung TEXT,
|
||||||
|
datum DATE
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- User-Daten
|
||||||
|
INSERT INTO User (vorname, nachname, strasse, hausnr, postleitzahl, ort, land, tel, email, isAdmin, password)
|
||||||
|
VALUES
|
||||||
|
('Max', 'Muster', 'Musterstraße', '1', '12345', 'Musterstadt', 'Deutschland', '0123456789', 'max@muster.de', FALSE, 'passwort123'),
|
||||||
|
('Anna', 'Beispiel', 'Beispielweg', '5a', '54321', 'Beispielstadt', 'Deutschland', '0987654321', 'anna@beispiel.de', TRUE, 'adminpass');
|
||||||
|
|
||||||
|
-- Standort-Daten
|
||||||
|
INSERT INTO Standort (strasse, hausnr, plz, ort, land, tel, email)
|
||||||
|
VALUES
|
||||||
|
('Galeriestraße', '10', '10115', 'Berlin', 'Deutschland', '030123456', 'kontakt@galerie-berlin.de'),
|
||||||
|
('Kunstallee', '22b', '50667', 'Köln', 'Deutschland', '0221123456', 'info@kunst-koeln.de');
|
||||||
|
|
||||||
|
-- Ausstellung-Daten
|
||||||
|
INSERT INTO Ausstellung (standortid, datum_von, datum_bis, name, beschreibung, max_tickets)
|
||||||
|
VALUES
|
||||||
|
(1, '2025-07-01', '2025-08-31', 'Moderne Meisterwerke', 'Eine Sammlung moderner Kunstwerke aus Europa.', 200),
|
||||||
|
(2, '2025-09-10', '2025-10-20', 'Kunst der Antike', 'Ausstellung antiker Skulpturen und Gemälde.', 150);
|
||||||
|
|
||||||
|
-- Gutschein-Daten (Spaltennamen korrigiert)
|
||||||
|
INSERT INTO Gutschein (code, rabatt, ausstellungid, gueltigkeit)
|
||||||
|
VALUES
|
||||||
|
('SOMMER2025', 15, 1, '2025-08-31'),
|
||||||
|
('HERBST25', 25, 2, '2025-10-15');
|
||||||
|
|
||||||
|
-- Ticket-Daten (Spaltennamen korrigiert)
|
||||||
|
INSERT INTO Ticket (userid, ausstellungid, kaufdatum, gueltigkeit, preis)
|
||||||
|
VALUES
|
||||||
|
(1, 1, '2025-06-01', '2025-07-15', 12.50),
|
||||||
|
(2, 2, '2025-06-05', '2025-09-15', 10.00);
|
||||||
|
|
||||||
|
-- News-Daten
|
||||||
|
INSERT INTO News (name, beschreibung, datum)
|
||||||
|
VALUES
|
||||||
|
('Neuer Standort eröffnet', 'Unsere Galerie in Köln ist jetzt geöffnet!', '2025-06-01'),
|
||||||
|
('Frühbucher-Rabatt', 'Sichern Sie sich jetzt 15% Rabatt auf unsere Sommerausstellung.', '2025-05-20');
|
||||||
|
|
||||||
|
--Änderungen:
|
||||||
|
|
||||||
|
ALTER TABLE austellung
|
||||||
|
ADD preis decimal NOT NULL
|
||||||
|
|
||||||
|
ALTER TABLE ticket
|
||||||
|
DROP COLUMN preis
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE user
|
||||||
|
MODIFY COLUMN userid INT NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
ALTER TABLE ticket
|
||||||
|
MODIFY COLUMN ticketid INT NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
ALTER TABLE standort
|
||||||
|
MODIFY COLUMN standortid INT NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
ALTER TABLE news
|
||||||
|
MODIFY COLUMN newsid INT NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
ALTER TABLE gutschein
|
||||||
|
MODIFY COLUMN gutscheinid INT NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
ALTER TABLE ausstellung
|
||||||
|
MODIFY COLUMN austellungid INT NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
ALTER TABLE user
|
||||||
|
MODIFY COLUMN isAdmin BOOLEAN DEFAULT FALSE;
|
||||||
|
|
||||||
|
ALTER TABLE user
|
||||||
|
ADD validUntil DATETIME NOT NULL DEFAULT '3025-01-01 00:00:00';
|
30
contact.sql
30
contact.sql
@@ -1,30 +0,0 @@
|
|||||||
-- phpMyAdmin SQL Dump
|
|
||||||
-- version 4.5.1
|
|
||||||
-- http://www.phpmyadmin.net
|
|
||||||
--
|
|
||||||
-- Host: 127.0.0.1
|
|
||||||
-- Erstellungszeit: 24. Nov 2017 um 17:01
|
|
||||||
-- Server-Version: 10.1.16-MariaDB
|
|
||||||
-- PHP-Version: 7.0.9
|
|
||||||
|
|
||||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
|
||||||
SET time_zone = "+00:00";
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Datenbank: `blog`
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
|
||||||
|
|
||||||
CREATE TABLE `contact` (
|
|
||||||
`id` varchar(36) NOT NULL,
|
|
||||||
`topicCode` tinyint(2) NULL,
|
|
||||||
`name` varchar(200) NOT NULL,
|
|
||||||
`email` varchar(300) NOT NULL,
|
|
||||||
`phone` varchar(16) NULL,
|
|
||||||
`content` varchar(500) NOT NULL,
|
|
||||||
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `contact`
|
|
||||||
ADD PRIMARY KEY (`id`)
|
|
79
index.php
79
index.php
@@ -1,50 +1,45 @@
|
|||||||
<?php
|
<?php
|
||||||
session_start();
|
|
||||||
include 'Views/header.phtml';
|
|
||||||
?>
|
|
||||||
<div id="wrapper">
|
|
||||||
<?php
|
|
||||||
spl_autoload_register(function ($className) {
|
|
||||||
if (substr($className, 0, 5) !== 'Blog\\') {
|
|
||||||
// not our business
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$fileName = __DIR__.'/'.str_replace('\\', DIRECTORY_SEPARATOR, substr($className, 5)).'.php';
|
session_start();;;
|
||||||
|
|
||||||
if (file_exists($fileName)) {
|
spl_autoload_register(function ($className) {
|
||||||
include $fileName;
|
if (substr($className, 0, 5) !== 'Blog\\') {
|
||||||
}
|
// not our business
|
||||||
});
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$controllerName = "";
|
|
||||||
$doMethodName = "";
|
|
||||||
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
|
||||||
$controllerName = isset($_POST['controller']) && $_POST['controller'] ? $_POST['controller'] : "Welcome";
|
|
||||||
$doMethodName = isset($_POST['do']) && $_POST['do'] ? $_POST['do'] : "showWelcome";
|
|
||||||
} else {
|
|
||||||
$controllerName = isset($_GET['controller']) && $_GET['controller'] ? $_GET['controller'] : "Welcome";
|
|
||||||
$doMethodName = isset($_GET['do']) && $_GET['do'] ? $_GET['do'] : "showWelcome";
|
|
||||||
}
|
|
||||||
|
|
||||||
$controllerClassName = 'Blog\\Controller\\'.ucfirst($controllerName).'Controller';
|
$fileName = __DIR__.'/'.str_replace('\\', DIRECTORY_SEPARATOR, substr($className, 5)).'.php';
|
||||||
|
|
||||||
if (method_exists($controllerClassName, $doMethodName)) {
|
if (file_exists($fileName)) {
|
||||||
$view = new \Blog\Library\View(__DIR__.DIRECTORY_SEPARATOR.'Views'
|
include $fileName;
|
||||||
, ucfirst($controllerName), $doMethodName);
|
}
|
||||||
|
});
|
||||||
$controller = new $controllerClassName($view);
|
|
||||||
$controller->$doMethodName();
|
|
||||||
|
$controllerName = "";
|
||||||
|
$doMethodName = "";
|
||||||
|
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||||
|
$controllerName = isset($_POST['controller']) && $_POST['controller'] ? $_POST['controller'] : "Welcome";
|
||||||
|
$doMethodName = isset($_POST['do']) && $_POST['do'] ? $_POST['do'] : "showWelcome";
|
||||||
|
} else {
|
||||||
|
$controllerName = isset($_GET['controller']) && $_GET['controller'] ? $_GET['controller'] : "Welcome";
|
||||||
|
$doMethodName = isset($_GET['do']) && $_GET['do'] ? $_GET['do'] : "showWelcome";
|
||||||
|
}
|
||||||
|
|
||||||
$view->render();
|
$controllerClassName = 'Blog\\Controller\\'.ucfirst($controllerName).'Controller';
|
||||||
|
|
||||||
} else {
|
if (method_exists($controllerClassName, $doMethodName)) {
|
||||||
new \Blog\Library\ErrorMsg('Page not found: '.$controllerClassName.'::'.$doMethodName);
|
$view = new \Blog\Library\View(__DIR__.DIRECTORY_SEPARATOR.'Views'
|
||||||
}
|
, ucfirst($controllerName), $doMethodName);
|
||||||
?>
|
|
||||||
</div>
|
$controller = new $controllerClassName($view);
|
||||||
<?php
|
$controller->$doMethodName();
|
||||||
include 'Views/footer.phtml';
|
|
||||||
|
$view->render();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
new \Blog\Library\ErrorMsg('Page not found: '.$controllerClassName.'::'.$doMethodName);
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user