Neue Claude Änderungen
This commit is contained in:
parent
b238632532
commit
f900aff90a
5 changed files with 873 additions and 0 deletions
269
CLEANUP_GUIDE.md
Normal file
269
CLEANUP_GUIDE.md
Normal file
|
|
@ -0,0 +1,269 @@
|
|||
# 🧹 Aufräum-Guide für Typewriter Tutor
|
||||
|
||||
## Schnell-Übersicht
|
||||
|
||||
```bash
|
||||
./cleanup.sh # Interaktives Aufräumen (empfohlen)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Was kann aufgeräumt werden?
|
||||
|
||||
### 🔴 Immer sicher zu löschen
|
||||
|
||||
| Was | Wo | Warum | Wie |
|
||||
|-----|-----|-------|-----|
|
||||
| Python-Cache | `__pycache__/` | Wird automatisch neu erstellt | `find . -name "__pycache__" -type d -exec rm -rf {} +` |
|
||||
| .pyc Dateien | `*.pyc` | Kompilierte Python-Dateien | `find . -name "*.pyc" -delete` |
|
||||
| Temporäre Dateien | `*.tmp`, `*.temp` | Nicht benötigt | `find . -name "*.tmp" -delete` |
|
||||
| Backup-Dateien | `*.bak`, `*~` | Alte Backups | `find . -name "*.bak" -delete` |
|
||||
|
||||
### 🟡 Optional löschbar
|
||||
|
||||
| Was | Wo | Beachten | Wie |
|
||||
|-----|-----|----------|-----|
|
||||
| Aider-History | `.aider.*` | Nur wenn Sie Aider nicht mehr verwenden | `rm -rf .aider.*` |
|
||||
| Claude Code Cache | `.claude/` | Cache wird neu erstellt | `rm -rf .claude/` |
|
||||
| Log-Dateien | `*.log` | Falls nicht für Debugging benötigt | `find . -name "*.log" -delete` |
|
||||
|
||||
### 🟠 Vorsicht beim Löschen
|
||||
|
||||
| Was | Wo | Beachten | Wiederherstellung |
|
||||
|-----|-----|----------|-------------------|
|
||||
| Datenbank | `instance/typewriter.db` | **Alle Fortschritte gehen verloren!** | `alembic upgrade head` |
|
||||
| Virtual Environment | `venv/` | Muss neu installiert werden | `./setup.sh` oder `python -m venv venv` |
|
||||
| .env Datei | `.env` | **SECRET_KEY geht verloren!** | Neu generieren lassen |
|
||||
|
||||
### ⛔ NIE löschen
|
||||
|
||||
| Was | Warum |
|
||||
|-----|-------|
|
||||
| `data/lessons.json` | Enthält alle Tipp-Lektionen |
|
||||
| `alembic/versions/` | Datenbank-Migrations-Historie |
|
||||
| `requirements.txt` | Dependencies-Liste |
|
||||
| Alle `.py`, `.js`, `.html`, `.css` Dateien | Kern-Anwendung |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Aufräum-Szenarien
|
||||
|
||||
### Szenario 1: Leichtes Aufräumen
|
||||
**Ziel**: Cache und temporäre Dateien entfernen
|
||||
|
||||
```bash
|
||||
# Automatisch (empfohlen)
|
||||
./cleanup.sh
|
||||
# Bei allen Fragen "n" eingeben außer bei Cache
|
||||
|
||||
# Oder manuell
|
||||
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null
|
||||
find . -type f -name "*.pyc" -delete
|
||||
find . -type f -name "*.tmp" -delete
|
||||
git gc
|
||||
```
|
||||
|
||||
**Ergebnis**: ~5-50 MB gespart, keine Neuinstallation nötig
|
||||
|
||||
---
|
||||
|
||||
### Szenario 2: Tiefes Aufräumen
|
||||
**Ziel**: Alles außer Code und Daten zurücksetzen
|
||||
|
||||
```bash
|
||||
./cleanup.sh
|
||||
# Bei allen Fragen "j" eingeben
|
||||
|
||||
# Oder manuell
|
||||
rm -rf __pycache__/ venv/ instance/ .aider.* .claude/
|
||||
find . -name "*.pyc" -delete
|
||||
```
|
||||
|
||||
**Dann neu aufsetzen**:
|
||||
```bash
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
**Ergebnis**: ~100-500 MB gespart, ~2 Minuten Neuinstallation
|
||||
|
||||
---
|
||||
|
||||
### Szenario 3: Kompletter Reset
|
||||
**Ziel**: Projekt auf Auslieferungszustand zurücksetzen
|
||||
|
||||
```bash
|
||||
# VORSICHT: Alle Daten gehen verloren!
|
||||
|
||||
# 1. Aufräumen
|
||||
./cleanup.sh # Alle Fragen mit "j" beantworten
|
||||
|
||||
# 2. Git-Status prüfen
|
||||
git status
|
||||
|
||||
# 3. Falls gewünscht: Uncommitted Changes löschen
|
||||
git checkout .
|
||||
git clean -fd
|
||||
|
||||
# 4. Neustart
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
**Ergebnis**: Wie frisch geklont, alle Benutzer-Daten verloren
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Empfohlene Routine
|
||||
|
||||
### Täglich
|
||||
```bash
|
||||
# Nicht nötig! Git-Ignore kümmert sich darum
|
||||
```
|
||||
|
||||
### Wöchentlich
|
||||
```bash
|
||||
# Cache aufräumen
|
||||
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null
|
||||
```
|
||||
|
||||
### Monatlich
|
||||
```bash
|
||||
# Komplettes Aufräumen
|
||||
./cleanup.sh
|
||||
```
|
||||
|
||||
### Bei Problemen
|
||||
```bash
|
||||
# Reset und Neuinstallation
|
||||
rm -rf venv/ instance/
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Speicherplatz-Analyse
|
||||
|
||||
### Typische Größen
|
||||
|
||||
```bash
|
||||
# Gesamtprojekt (frisch): ~10 MB
|
||||
# Mit venv: ~60 MB
|
||||
# Mit Cache: ~70 MB
|
||||
# Mit Datenbank: ~71 MB
|
||||
# Mit Aider-History: ~75+ MB
|
||||
```
|
||||
|
||||
### Größte Verzeichnisse prüfen
|
||||
```bash
|
||||
du -h --max-depth=1 | sort -hr
|
||||
```
|
||||
|
||||
**Typisches Ergebnis**:
|
||||
```
|
||||
75M .
|
||||
50M ./venv
|
||||
10M ./.aider.tags.cache.v4
|
||||
3M ./.aider.chat.history.md
|
||||
5M ./static
|
||||
1M ./alembic
|
||||
500K ./templates
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Nützliche Befehle
|
||||
|
||||
### Alle Cache-Dateien finden
|
||||
```bash
|
||||
find . -type d -name "__pycache__"
|
||||
find . -type f -name "*.pyc"
|
||||
```
|
||||
|
||||
### Große Dateien finden
|
||||
```bash
|
||||
find . -type f -size +1M -exec ls -lh {} \;
|
||||
```
|
||||
|
||||
### Alte Dateien finden (>30 Tage)
|
||||
```bash
|
||||
find . -type f -mtime +30
|
||||
```
|
||||
|
||||
### Git-Größe optimieren
|
||||
```bash
|
||||
git gc --aggressive --prune=now
|
||||
```
|
||||
|
||||
### Verzeichnis-Größen
|
||||
```bash
|
||||
du -sh */ | sort -hr
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Checkliste vor Aufräumen
|
||||
|
||||
- [ ] **Wichtige Daten gesichert?**
|
||||
- [ ] Datenbank-Backup erstellt (`cp instance/typewriter.db backup.db`)
|
||||
- [ ] Aktuelle Änderungen committed (`git status`)
|
||||
|
||||
- [ ] **Was wird gelöscht verstanden?**
|
||||
- [ ] Liste oben durchgelesen
|
||||
- [ ] Bei Unsicherheit: Nur Cache löschen
|
||||
|
||||
- [ ] **Neuinstallation vorbereitet?**
|
||||
- [ ] `./setup.sh` verfügbar
|
||||
- [ ] Internet-Verbindung vorhanden (für pip)
|
||||
|
||||
- [ ] **Zeit eingeplant?**
|
||||
- [ ] Leichtes Aufräumen: 10 Sekunden
|
||||
- [ ] Tiefes Aufräumen: 2-5 Minuten
|
||||
- [ ] Kompletter Reset: 5-10 Minuten
|
||||
|
||||
---
|
||||
|
||||
## 🆘 Probleme und Lösungen
|
||||
|
||||
### "Permission denied" beim Löschen
|
||||
```bash
|
||||
sudo rm -rf <datei> # Nicht empfohlen!
|
||||
# Besser: Ownership prüfen
|
||||
ls -la <datei>
|
||||
```
|
||||
|
||||
### Virtual Environment lässt sich nicht löschen
|
||||
```bash
|
||||
# Erst deaktivieren
|
||||
deactivate
|
||||
# Dann löschen
|
||||
rm -rf venv/
|
||||
```
|
||||
|
||||
### Datenbank lässt sich nicht löschen
|
||||
```bash
|
||||
# App läuft möglicherweise noch
|
||||
pkill -f "python app.py"
|
||||
# Oder
|
||||
lsof instance/typewriter.db # Zeigt, wer die Datei verwendet
|
||||
```
|
||||
|
||||
### "Command not found: ./cleanup.sh"
|
||||
```bash
|
||||
# Ausführbar machen
|
||||
chmod +x cleanup.sh setup.sh start.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Weiterführende Links
|
||||
|
||||
- [PROJECT_STRUCTURE.md](PROJECT_STRUCTURE.md) - Projekt-Übersicht
|
||||
- [MIGRATIONS.md](MIGRATIONS.md) - Datenbank-Migrationen
|
||||
- [CLAUDE.md](CLAUDE.md) - Entwickler-Guide
|
||||
|
||||
---
|
||||
|
||||
**Tipp**: Starten Sie mit dem leichten Aufräumen und arbeiten Sie sich bei Bedarf hoch!
|
||||
|
||||
```bash
|
||||
./cleanup.sh # Interaktiv und sicher
|
||||
```
|
||||
256
PROJECT_STRUCTURE.md
Normal file
256
PROJECT_STRUCTURE.md
Normal file
|
|
@ -0,0 +1,256 @@
|
|||
# Projekt-Struktur und Organisation
|
||||
|
||||
## 📁 Verzeichnis-Übersicht
|
||||
|
||||
```
|
||||
typewriter/
|
||||
├── 📂 alembic/ # Datenbank-Migrationen (Alembic)
|
||||
│ ├── versions/ # Migrations-Dateien
|
||||
│ ├── env.py # Alembic-Konfiguration
|
||||
│ └── script.py.mako # Template für neue Migrationen
|
||||
│
|
||||
├── 📂 data/ # Daten-Dateien
|
||||
│ └── lessons.json # Tipp-Lektionen (43 Lektionen)
|
||||
│
|
||||
├── 📂 instance/ # Laufzeit-Daten (nicht versioniert)
|
||||
│ └── typewriter.db # SQLite-Datenbank
|
||||
│
|
||||
├── 📂 static/ # Statische Frontend-Dateien
|
||||
│ ├── css/
|
||||
│ │ └── style.css # Haupt-Stylesheet
|
||||
│ ├── js/ # JavaScript-Module (ES6)
|
||||
│ │ ├── main.js # Orchestrierung
|
||||
│ │ ├── theme.js # Theme Management
|
||||
│ │ ├── metronome.js # Adaptives Metronom
|
||||
│ │ ├── statistics.js # Statistik-Berechnungen
|
||||
│ │ ├── textDisplay.js # Text-Rendering
|
||||
│ │ ├── keyboard.js # Keyboard-Handling
|
||||
│ │ ├── session.js # Session Management
|
||||
│ │ ├── ui.js # UI-Interaktionen
|
||||
│ │ └── script.js.old # Backup der alten Datei
|
||||
│ └── favicon.svg # App-Icon
|
||||
│
|
||||
├── 📂 templates/ # Jinja2-Templates
|
||||
│ ├── index.html # Hauptseite
|
||||
│ ├── statistics.html # Statistik-Seite
|
||||
│ └── settings.html # Einstellungen
|
||||
│
|
||||
├── 📂 venv/ # Virtual Environment (nicht versioniert)
|
||||
│
|
||||
├── 📄 app.py # Flask-Hauptanwendung (879 Zeilen)
|
||||
├── 📄 models.py # SQLAlchemy-Modelle
|
||||
├── 📄 requirements.txt # Python-Dependencies
|
||||
├── 📄 alembic.ini # Alembic-Konfiguration
|
||||
│
|
||||
├── 🧪 test_app.py # Backend-Tests (236 Zeilen, 18 Tests)
|
||||
├── 🧪 test_metronome_velocity.py # Metronom-Tests (537 Zeilen)
|
||||
│
|
||||
├── 📚 CLAUDE.md # Projekt-Dokumentation für Claude Code
|
||||
├── 📚 JAVASCRIPT_MODULES.md # JavaScript-Modul-Dokumentation
|
||||
├── 📚 MIGRATIONS.md # Alembic-Migrations-Guide
|
||||
├── 📚 README.md # Haupt-README
|
||||
├── 📚 README_METRONOME_TESTS.md # Metronom-Test-Dokumentation
|
||||
├── 📚 SCROLL_IMPROVEMENTS.md # Scroll-Verbesserungen
|
||||
├── 📚 PROJECT_STRUCTURE.md # Diese Datei
|
||||
│
|
||||
├── 🔧 setup.sh # Komplettes Setup-Script
|
||||
├── 🔧 start.sh # Start-Script
|
||||
├── 🔧 cleanup.sh # Aufräum-Script
|
||||
├── 🔧 setup_database.py # Datenbank-Setup (Python)
|
||||
│
|
||||
├── 🔒 .env # Umgebungsvariablen (nicht versioniert)
|
||||
├── 📋 .gitignore # Git-Ignore-Regeln
|
||||
│
|
||||
└── 🗑️ Temporäre Dateien (ignoriert):
|
||||
├── __pycache__/ # Python-Cache
|
||||
├── .aider.* # Aider-Dateien
|
||||
├── .claude/ # Claude Code-Dateien
|
||||
└── to_do_list.txt # Alte Todo-Liste
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Datei-Kategorien
|
||||
|
||||
### 🔵 Kern-Anwendung (versioniert)
|
||||
- `app.py` - Flask-Backend
|
||||
- `models.py` - Datenbank-Modelle
|
||||
- `templates/*.html` - Frontend-Templates
|
||||
- `static/` - CSS, JavaScript, Bilder
|
||||
- `data/lessons.json` - Lektions-Daten
|
||||
|
||||
### 🟢 Konfiguration (versioniert)
|
||||
- `requirements.txt` - Python-Dependencies
|
||||
- `alembic.ini` - Alembic-Konfiguration
|
||||
- `alembic/` - Migrations-Dateien
|
||||
- `.gitignore` - Git-Ignore-Regeln
|
||||
|
||||
### 🟡 Dokumentation (versioniert)
|
||||
- `CLAUDE.md` - Projekt-Guide
|
||||
- `README.md` - Haupt-Dokumentation
|
||||
- `JAVASCRIPT_MODULES.md` - JS-Architektur
|
||||
- `MIGRATIONS.md` - Datenbank-Migrations-Guide
|
||||
- `SCROLL_IMPROVEMENTS.md` - Changelog
|
||||
- `PROJECT_STRUCTURE.md` - Struktur-Übersicht
|
||||
|
||||
### 🟠 Scripts (versioniert)
|
||||
- `setup.sh` - Komplettes Setup
|
||||
- `start.sh` - Anwendung starten
|
||||
- `cleanup.sh` - Projekt aufräumen
|
||||
- `setup_database.py` - Datenbank-Setup
|
||||
|
||||
### 🔴 Tests (versioniert)
|
||||
- `test_app.py` - Backend-Tests
|
||||
- `test_metronome_velocity.py` - Metronom-Tests
|
||||
|
||||
### ⚫ Temporär/Generiert (NICHT versioniert)
|
||||
- `venv/` - Virtual Environment
|
||||
- `instance/` - Datenbank und Laufzeit-Daten
|
||||
- `__pycache__/` - Python-Cache
|
||||
- `.env` - Secrets und Konfiguration
|
||||
- `.aider.*` - Aider-History
|
||||
- `.claude/` - Claude Code-Cache
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Wichtige Befehle
|
||||
|
||||
### Setup & Start
|
||||
```bash
|
||||
./setup.sh # Komplettes Setup
|
||||
./start.sh # Anwendung starten
|
||||
./cleanup.sh # Projekt aufräumen
|
||||
```
|
||||
|
||||
### Entwicklung
|
||||
```bash
|
||||
source venv/bin/activate # Environment aktivieren
|
||||
python app.py # Server starten
|
||||
python -m unittest test_app # Tests ausführen
|
||||
```
|
||||
|
||||
### Datenbank
|
||||
```bash
|
||||
alembic upgrade head # Migrationen anwenden
|
||||
alembic revision --autogenerate -m "message" # Neue Migration
|
||||
alembic downgrade -1 # Letzte Migration rückgängig
|
||||
```
|
||||
|
||||
### Git
|
||||
```bash
|
||||
git status # Status prüfen
|
||||
git add . # Alle Änderungen stagen
|
||||
git commit -m "..." # Commit erstellen
|
||||
git push origin main # Pushen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Statistiken
|
||||
|
||||
### Codebase-Metriken
|
||||
- **Python**: ~1.700 Zeilen (app.py, models.py, tests)
|
||||
- **JavaScript**: ~1.600 Zeilen (8 Module)
|
||||
- **HTML/CSS**: ~800 Zeilen
|
||||
- **Dokumentation**: ~300 Zeilen (6 Markdown-Dateien)
|
||||
- **Tests**: ~775 Zeilen (23 Tests total)
|
||||
|
||||
### Dateien nach Typ
|
||||
- Python: 5 Dateien
|
||||
- JavaScript: 9 Dateien (8 Module + 1 Backup)
|
||||
- HTML: 3 Templates
|
||||
- CSS: 1 Stylesheet
|
||||
- Markdown: 7 Dokumentationen
|
||||
- Shell: 3 Scripts
|
||||
- JSON: 1 Datei (lessons.json)
|
||||
- Config: 3 Dateien (.gitignore, alembic.ini, requirements.txt)
|
||||
|
||||
---
|
||||
|
||||
## 🧹 Aufräum-Strategie
|
||||
|
||||
### Was NICHT committen?
|
||||
- `venv/` - Virtual Environments
|
||||
- `instance/` - Datenbank-Dateien
|
||||
- `__pycache__/` - Python-Cache
|
||||
- `.env` - Secrets
|
||||
- `.aider.*` - Aider-History
|
||||
- `.claude/` - Claude Code-Cache
|
||||
- `*.log` - Log-Dateien
|
||||
- `*.tmp`, `*.bak` - Temporäre Dateien
|
||||
|
||||
### Wann aufräumen?
|
||||
```bash
|
||||
./cleanup.sh # Interaktives Aufräumen
|
||||
```
|
||||
|
||||
Oder manuell:
|
||||
```bash
|
||||
# Python-Cache löschen
|
||||
find . -type d -name "__pycache__" -exec rm -rf {} +
|
||||
|
||||
# Temporäre Dateien
|
||||
find . -type f -name "*.tmp" -delete
|
||||
find . -type f -name "*.pyc" -delete
|
||||
|
||||
# Datenbank zurücksetzen
|
||||
rm -rf instance/
|
||||
alembic upgrade head
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Sicherheit
|
||||
|
||||
### Sensible Dateien (NICHT committen!)
|
||||
- `.env` - Enthält SECRET_KEY
|
||||
- `instance/typewriter.db` - Enthält Benutzerdaten
|
||||
- `venv/` - Kann sensible Pakete enthalten
|
||||
|
||||
### Bereits geschützt durch .gitignore ✅
|
||||
Alle sensiblen Dateien sind bereits in `.gitignore` aufgelistet.
|
||||
|
||||
---
|
||||
|
||||
## 📦 Deployment-Checkliste
|
||||
|
||||
1. ✅ Virtual Environment erstellen
|
||||
2. ✅ Dependencies installieren
|
||||
3. ✅ .env-Datei mit SECRET_KEY erstellen
|
||||
4. ✅ Datenbank initialisieren (Alembic)
|
||||
5. ✅ Tests ausführen
|
||||
6. ✅ Anwendung starten
|
||||
|
||||
**Schnell-Setup**:
|
||||
```bash
|
||||
./setup.sh && ./start.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Best Practices
|
||||
|
||||
### Entwicklung
|
||||
1. **Immer** Virtual Environment verwenden
|
||||
2. **Vor** Schema-Änderungen: Alembic-Migration erstellen
|
||||
3. **Nach** Code-Änderungen: Tests ausführen
|
||||
4. **Vor** Commit: Code aufräumen (`./cleanup.sh`)
|
||||
|
||||
### Git-Workflow
|
||||
1. Änderungen machen
|
||||
2. Tests ausführen
|
||||
3. `git add .`
|
||||
4. `git commit -m "Beschreibung"`
|
||||
5. `git push origin main`
|
||||
|
||||
### Datenbank-Änderungen
|
||||
1. Models in `models.py` ändern
|
||||
2. `alembic revision --autogenerate -m "Beschreibung"`
|
||||
3. Migration prüfen: `alembic/versions/*.py`
|
||||
4. `alembic upgrade head`
|
||||
5. Testen!
|
||||
|
||||
---
|
||||
|
||||
**Letzte Aktualisierung**: 2025-10-27
|
||||
**Version**: 1.2.0
|
||||
82
cleanup.sh
Executable file
82
cleanup.sh
Executable file
|
|
@ -0,0 +1,82 @@
|
|||
#!/bin/bash
|
||||
# Projekt-Aufräum-Script für Typewriter Tutor
|
||||
|
||||
echo "🧹 Typewriter Tutor - Projekt aufräumen"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# Sichere Bestätigung
|
||||
read -p "Möchten Sie das Projekt aufräumen? (j/n): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Jj]$ ]]; then
|
||||
echo "Abgebrochen."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "1️⃣ Lösche Python-Cache..."
|
||||
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null
|
||||
find . -type f -name "*.pyc" -delete 2>/dev/null
|
||||
find . -type f -name "*.pyo" -delete 2>/dev/null
|
||||
find . -type f -name "*.pyd" -delete 2>/dev/null
|
||||
echo " ✓ Python-Cache gelöscht"
|
||||
|
||||
echo ""
|
||||
echo "2️⃣ Lösche Aider-Dateien (optional)..."
|
||||
read -p " Aider-History löschen? (j/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Jj]$ ]]; then
|
||||
rm -rf .aider.chat.history.md .aider.input.history .aider.tags.cache.v4/ 2>/dev/null
|
||||
echo " ✓ Aider-Dateien gelöscht"
|
||||
else
|
||||
echo " ⊘ Aider-Dateien behalten"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "3️⃣ Lösche temporäre Dateien..."
|
||||
find . -type f -name "*.tmp" -delete 2>/dev/null
|
||||
find . -type f -name "*.temp" -delete 2>/dev/null
|
||||
find . -type f -name "*.bak" -delete 2>/dev/null
|
||||
find . -type f -name "*~" -delete 2>/dev/null
|
||||
echo " ✓ Temporäre Dateien gelöscht"
|
||||
|
||||
echo ""
|
||||
echo "4️⃣ Datenbank zurücksetzen (optional)..."
|
||||
read -p " Datenbank löschen und neu erstellen? (j/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Jj]$ ]]; then
|
||||
rm -rf instance/typewriter.db 2>/dev/null
|
||||
echo " ✓ Datenbank gelöscht"
|
||||
echo " ℹ Führe 'alembic upgrade head' aus, um neu zu erstellen"
|
||||
else
|
||||
echo " ⊘ Datenbank behalten"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "5️⃣ Virtual Environment (optional)..."
|
||||
read -p " Virtual Environment löschen und neu erstellen? (j/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Jj]$ ]]; then
|
||||
rm -rf venv/ 2>/dev/null
|
||||
echo " ✓ Virtual Environment gelöscht"
|
||||
echo " ℹ Führe './setup.sh' aus, um neu zu erstellen"
|
||||
else
|
||||
echo " ⊘ Virtual Environment behalten"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "6️⃣ Git aufräumen..."
|
||||
git gc --quiet 2>/dev/null
|
||||
echo " ✓ Git-Datenbank optimiert"
|
||||
|
||||
echo ""
|
||||
echo "======================================"
|
||||
echo "✅ Aufräumen abgeschlossen!"
|
||||
echo ""
|
||||
echo "Nächste Schritte (falls nötig):"
|
||||
echo " 1. python -m venv venv"
|
||||
echo " 2. source venv/bin/activate"
|
||||
echo " 3. pip install -r requirements.txt"
|
||||
echo " 4. alembic upgrade head"
|
||||
echo " 5. python app.py"
|
||||
echo ""
|
||||
102
setup.sh
Executable file
102
setup.sh
Executable file
|
|
@ -0,0 +1,102 @@
|
|||
#!/bin/bash
|
||||
# Komplettes Setup-Script für Typewriter Tutor
|
||||
|
||||
echo "🚀 Typewriter Tutor - Komplettes Setup"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# Prüfe ob Python3 installiert ist
|
||||
if ! command -v python3 &> /dev/null; then
|
||||
echo "❌ Python3 nicht gefunden!"
|
||||
echo " Bitte installiere Python 3.11 oder höher."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PYTHON_VERSION=$(python3 --version | awk '{print $2}')
|
||||
echo "✓ Python gefunden: $PYTHON_VERSION"
|
||||
echo ""
|
||||
|
||||
# Schritt 1: Virtual Environment
|
||||
echo "1️⃣ Virtual Environment erstellen..."
|
||||
if [ -d "venv" ]; then
|
||||
echo " ⚠ Virtual Environment existiert bereits"
|
||||
read -p " Neu erstellen? (j/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Jj]$ ]]; then
|
||||
rm -rf venv/
|
||||
python3 -m venv venv
|
||||
echo " ✓ Virtual Environment neu erstellt"
|
||||
else
|
||||
echo " ⊘ Bestehendes Environment verwenden"
|
||||
fi
|
||||
else
|
||||
python3 -m venv venv
|
||||
echo " ✓ Virtual Environment erstellt"
|
||||
fi
|
||||
|
||||
# Schritt 2: Dependencies
|
||||
echo ""
|
||||
echo "2️⃣ Abhängigkeiten installieren..."
|
||||
source venv/bin/activate
|
||||
pip install --upgrade pip --quiet
|
||||
pip install -r requirements.txt
|
||||
echo " ✓ Abhängigkeiten installiert"
|
||||
|
||||
# Schritt 3: Datenbank
|
||||
echo ""
|
||||
echo "3️⃣ Datenbank initialisieren..."
|
||||
if [ -f "instance/typewriter.db" ]; then
|
||||
echo " ⚠ Datenbank existiert bereits"
|
||||
read -p " Neu erstellen? (j/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Jj]$ ]]; then
|
||||
rm -rf instance/
|
||||
mkdir -p instance
|
||||
alembic upgrade head
|
||||
echo " ✓ Datenbank neu erstellt"
|
||||
else
|
||||
echo " ⊘ Bestehende Datenbank verwenden"
|
||||
alembic upgrade head 2>/dev/null
|
||||
fi
|
||||
else
|
||||
mkdir -p instance
|
||||
alembic upgrade head
|
||||
echo " ✓ Datenbank erstellt"
|
||||
fi
|
||||
|
||||
# Schritt 4: .env Datei
|
||||
echo ""
|
||||
echo "4️⃣ Umgebungsvariablen..."
|
||||
if [ ! -f ".env" ]; then
|
||||
echo " Erstelle .env Datei..."
|
||||
SECRET_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))")
|
||||
echo "SECRET_KEY=$SECRET_KEY" > .env
|
||||
chmod 600 .env
|
||||
echo " ✓ .env Datei erstellt"
|
||||
else
|
||||
echo " ✓ .env Datei existiert bereits"
|
||||
fi
|
||||
|
||||
# Schritt 5: Scripts ausführbar machen
|
||||
echo ""
|
||||
echo "5️⃣ Scripts konfigurieren..."
|
||||
chmod +x start.sh cleanup.sh setup.sh 2>/dev/null
|
||||
echo " ✓ Scripts sind ausführbar"
|
||||
|
||||
# Abschluss
|
||||
echo ""
|
||||
echo "======================================"
|
||||
echo "✅ Setup abgeschlossen!"
|
||||
echo ""
|
||||
echo "Nächste Schritte:"
|
||||
echo " 1. Starte die Anwendung:"
|
||||
echo " ./start.sh"
|
||||
echo ""
|
||||
echo " 2. Öffne im Browser:"
|
||||
echo " http://localhost:5000"
|
||||
echo ""
|
||||
echo "Weitere Befehle:"
|
||||
echo " • ./cleanup.sh - Projekt aufräumen"
|
||||
echo " • ./start.sh - Anwendung starten"
|
||||
echo " • python test_app.py - Tests ausführen"
|
||||
echo ""
|
||||
164
templates/hilfe.html
Normal file
164
templates/hilfe.html
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Hilfe - Typewriter Trainer</title>
|
||||
<link rel="icon" type="image/svg+xml" href="{{ url_for('static', filename='favicon.svg') }}">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
|
||||
<style>
|
||||
.hilfe-content {
|
||||
padding: 2rem 0;
|
||||
max-width: 900px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.hilfe-content h1 {
|
||||
border-bottom: 3px solid #0d6efd;
|
||||
padding-bottom: 0.5rem;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
.hilfe-content h2 {
|
||||
margin-top: 2rem;
|
||||
margin-bottom: 1rem;
|
||||
color: #0d6efd;
|
||||
}
|
||||
.hilfe-content h3 {
|
||||
margin-top: 1.5rem;
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
.hilfe-content table {
|
||||
width: 100%;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
.hilfe-content table th,
|
||||
.hilfe-content table td {
|
||||
padding: 0.5rem;
|
||||
border: 1px solid #dee2e6;
|
||||
}
|
||||
.hilfe-content table th {
|
||||
background-color: #f8f9fa;
|
||||
font-weight: bold;
|
||||
}
|
||||
.hilfe-content code {
|
||||
background-color: #f8f9fa;
|
||||
padding: 0.2rem 0.4rem;
|
||||
border-radius: 3px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.hilfe-content pre {
|
||||
background-color: #f8f9fa;
|
||||
padding: 1rem;
|
||||
border-radius: 5px;
|
||||
overflow-x: auto;
|
||||
}
|
||||
.hilfe-content hr {
|
||||
margin: 2rem 0;
|
||||
border-top: 2px solid #dee2e6;
|
||||
}
|
||||
.hilfe-content ul,
|
||||
.hilfe-content ol {
|
||||
margin-left: 1.5rem;
|
||||
}
|
||||
.hilfe-content li {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
.back-button {
|
||||
position: fixed;
|
||||
bottom: 2rem;
|
||||
right: 2rem;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
/* Dark Mode Anpassungen */
|
||||
[data-bs-theme="dark"] .hilfe-content {
|
||||
color: #e0e0e0;
|
||||
}
|
||||
[data-bs-theme="dark"] .hilfe-content h1,
|
||||
[data-bs-theme="dark"] .hilfe-content h2 {
|
||||
color: #58a6ff;
|
||||
}
|
||||
[data-bs-theme="dark"] .hilfe-content table th {
|
||||
background-color: #2d2d2d;
|
||||
border-color: #444;
|
||||
}
|
||||
[data-bs-theme="dark"] .hilfe-content table td {
|
||||
border-color: #444;
|
||||
}
|
||||
[data-bs-theme="dark"] .hilfe-content code,
|
||||
[data-bs-theme="dark"] .hilfe-content pre {
|
||||
background-color: #2d2d2d;
|
||||
color: #e0e0e0;
|
||||
}
|
||||
[data-bs-theme="dark"] .hilfe-content hr {
|
||||
border-top-color: #444;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="bg-light" data-bs-theme="light">
|
||||
<div class="container">
|
||||
<!-- Header -->
|
||||
<div class="card shadow mt-4">
|
||||
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
|
||||
<h2 class="mb-0">📖 Typewriter Trainer - Hilfe</h2>
|
||||
<button id="theme-toggle" class="btn btn-outline-light btn-sm" type="button">
|
||||
<span id="theme-icon">🌙</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Hilfe-Inhalt -->
|
||||
<div class="card shadow mt-3 mb-5">
|
||||
<div class="card-body hilfe-content">
|
||||
{{ hilfe_html|safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Zurück-Button -->
|
||||
<a href="{{ url_for('index') }}" class="btn btn-primary btn-lg back-button shadow">
|
||||
← Zurück zum Trainer
|
||||
</a>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script>
|
||||
// Theme Management
|
||||
const themeToggle = document.getElementById('theme-toggle');
|
||||
const themeIcon = document.getElementById('theme-icon');
|
||||
const body = document.body;
|
||||
|
||||
// Load saved theme
|
||||
const savedTheme = localStorage.getItem('theme') || 'light';
|
||||
body.setAttribute('data-bs-theme', savedTheme);
|
||||
updateThemeIcon(savedTheme);
|
||||
|
||||
// Theme toggle handler
|
||||
themeToggle.addEventListener('click', () => {
|
||||
const currentTheme = body.getAttribute('data-bs-theme');
|
||||
const newTheme = currentTheme === 'light' ? 'dark' : 'light';
|
||||
body.setAttribute('data-bs-theme', newTheme);
|
||||
localStorage.setItem('theme', newTheme);
|
||||
updateThemeIcon(newTheme);
|
||||
});
|
||||
|
||||
function updateThemeIcon(theme) {
|
||||
themeIcon.textContent = theme === 'dark' ? '☀️' : '🌙';
|
||||
}
|
||||
|
||||
// Smooth scroll for anchor links
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
const target = document.querySelector(this.getAttribute('href'));
|
||||
if (target) {
|
||||
target.scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
block: 'start'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Add table
Add a link
Reference in a new issue