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>
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
<!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>
|
||||
Reference in New Issue
Block a user