Files
mindflux/src/main/resources/templates/profile.html
T
AliceDarkest 9022961762 Volle Mindflux-App ins Deploy-Repo übernehmen
Ersetzt das Hello-World-Gerüst durch die vollständige Anwendung
(com.example.mindflux: 64 Klassen, Thymeleaf-Templates, Static-Assets,
Flyway V1–V6). Deploy-Infrastruktur (.gitea, Dockerfile) bleibt erhalten.

- pom: volle Abhängigkeiten (Security, Thymeleaf, JPA, Flyway), Spring Boot 3.4.4 / Java 17
- docker-compose: SPRING_DATASOURCE_* unverändert; App lauscht auf 8080
  (nginx -> mindflux:8080); Uploads-Volume; Admin-Passwörter via Gitea-Secrets
- Workflow: Deploy-Step injiziert MINDFLUX_ADMIN*_PASSWORD aus Secrets
- .dockerignore ergänzt; Hello-World (com.mindflux) und Test-Datei 'main' entfernt

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 14:51:30 +02:00

112 lines
4.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de" data-theme="dark" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mindflux – Profil</title>
<link rel="stylesheet" href="/css/theme.css">
<script src="/js/theme.js"></script>
<style>
.mf-tab-nav { display:flex; flex-wrap:wrap; gap:.4rem; margin-bottom:1.4rem; }
.mf-tab { padding:.55rem .95rem; border-radius:10px; border:1px solid var(--border); color:var(--muted); text-decoration:none; font-size:.85rem; font-weight:700; transition:all .18s ease; }
.mf-tab:hover { color:var(--text); background:var(--surface-2); }
.mf-tab.active { color:var(--accent-ink); background:linear-gradient(100deg,var(--accent),var(--accent-2)); box-shadow:0 0 18px var(--glow-s); border-color:transparent; }
.mf-profile-pic { display:flex; justify-content:center; margin-bottom:1.3rem; }
.mf-profile-pic img { width:140px; height:140px; border-radius:50%; object-fit:cover; border:2px solid var(--border-accent); box-shadow:0 0 22px var(--glow-w); }
.mf-success { margin-bottom:1.2rem; transition:opacity 1.5s ease; }
.mf-footer { text-align:center; color:var(--muted); font-size:.82rem; padding:1.6rem 1rem; }
.mf-footer a { color:var(--muted); text-decoration:none; margin:0 .15rem; }
.mf-footer a:hover { color:var(--accent); }
</style>
</head>
<body>
<div class="mf-theme-float"><button class="mf-theme"></button></div>
<div class="mf-container">
<div class="mf-page-head">
<a th:href="@{/dashboard}" class="mf-back">⟵ Zurück zum Dashboard</a>
</div>
<span class="mf-eyebrow">Mein Profil</span>
<h1 style="color:var(--heading); font-size:1.9rem; font-weight:800; margin:.3rem 0 .25rem;">👤 Mein Profil</h1>
<p style="color:var(--muted); margin-bottom:1.4rem;">Alles rund um dich und deinen Fortschritt</p>
<nav class="mf-tab-nav">
<a th:href="@{/profile}" class="mf-tab active">Profil</a>
<a th:href="@{/progress}" class="mf-tab">Fortschritt</a>
<a th:href="@{/profile/achievements}" class="mf-tab">Erfolge</a>
<a th:href="@{/soziales}" class="mf-tab">Soziales</a>
<a th:href="@{/profile/settings}" class="mf-tab">Einstellungen</a>
</nav>
<!-- Erfolgsmeldung -->
<div th:if="${message}" class="mf-panel accent mf-success" id="successMessage">
<p th:text="${message}" style="color:var(--accent); margin:0;"></p>
</div>
<div class="mf-panel">
<!-- Profilbild-Vorschau -->
<div class="mf-profile-pic">
<img th:src="${user.profilePicture != null and !#strings.isEmpty(user.profilePicture)} ?
@{/uploads/profiles/{file}(file=${user.profilePicture})} :
@{/img/profiles/default-profile.png}"
alt="Profilbild">
</div>
<!-- Profil bearbeiten -->
<form th:action="@{/profile/update}" method="post" enctype="multipart/form-data">
<div class="mf-field">
<label class="mf-label">Benutzername</label>
<input class="mf-input" type="text" name="username" th:value="${user.username}" readonly>
</div>
<div class="mf-field">
<label class="mf-label">E-Mail</label>
<input class="mf-input" type="email" name="email" th:value="${user.email}" required>
</div>
<div class="mf-field">
<label class="mf-label">Profilbild hochladen</label>
<input class="mf-input" type="file" name="profilePicture" accept=".jpg,.jpeg,.png">
</div>
<button type="submit" class="mf-btn">Speichern</button>
</form>
<!-- Profilbild löschen -->
<form th:action="@{/profile/delete-picture}" method="post" style="margin-top:1rem;">
<button type="submit" class="mf-btn danger">Profilbild entfernen</button>
</form>
</div>
<footer class="mf-footer">
<a href="#">Support</a>
<a href="#">Feedback</a>
<a href="#">Nutzungsbedingungen</a>
<a href="#">Richtlinien</a>
<a href="#">Datenschutz</a>
<a href="#">Impressum</a>
</footer>
</div>
<script>
window.addEventListener('DOMContentLoaded', () => {
const successMessage = document.getElementById('successMessage');
if (successMessage) {
setTimeout(() => {
successMessage.style.opacity = '0';
setTimeout(() => {
successMessage.style.display = 'none';
}, 1500);
}, 3000);
}
});
</script>
</body>
</html>