From edf3049e4239bcaed361908977abde2b011dc067 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Sun, 27 Apr 2025 14:50:20 +0200 Subject: [PATCH] Remove deprecated files and templates: Delete unused files including deployment scripts, environment configurations, and various HTML templates to streamline the project structure. This cleanup enhances maintainability and reduces clutter in the codebase. --- website/.env => .env | 0 Dockerfile | 10 - README.md | 180 +++++++++++------- website/ROADMAP.md => ROADMAP.md | 0 website/TOOLS.py => TOOLS.py | 0 website/app.py => app.py | 0 website/cookies.txt => cookies.txt | 0 copy-network-image.bat | 33 ---- {website/database => database}/systades.db | Bin .../database => database}/systades.db.backup | Bin deploy.py | 86 --------- deploy.sh | 60 ------ docker-compose.yml | 7 - ANLEITUNG.md => docs/ANLEITUNG.md | 0 .../Grundstruktur (funktionales Modell).pdf | Bin website/example.env => example.env | 0 website/init_db.py => init_db.py | 0 website/models.py => models.py | 0 setup.py | 53 ------ {website/static => static}/background.js | 0 {website/static => static}/background.mp4 | 0 {website/static => static}/css/assistant.css | 0 .../static => static}/css/base-styles.css | 0 {website/static => static}/css/main.css | 0 {website/static => static}/css/src/input.css | 0 {website/static => static}/css/style.css | 0 {website/static => static}/d3-extensions.js | 0 {website/static => static}/img/favicon-gen.py | 0 {website/static => static}/img/favicon.svg | 0 {website/static => static}/js/main.js | 0 .../js/modules/chatgpt-assistant.js | 0 .../js/modules/mindmap-page.js | 0 .../static => static}/js/modules/mindmap.js | 0 {website/static => static}/mindmap.js | 0 .../static => static}/network-animation.js | 0 .../static => static}/network-background.js | 0 {website/static => static}/three.min.js | 0 .../tailwind.config.js => tailwind.config.js | 0 {website/templates => templates}/admin.html | 0 {website/templates => templates}/agb.html | 0 {website/templates => templates}/base.html | 0 .../templates => templates}/datenschutz.html | 0 .../templates => templates}/errors/403.html | 0 .../templates => templates}/errors/404.html | 0 .../templates => templates}/errors/429.html | 0 .../templates => templates}/errors/500.html | 0 .../templates => templates}/impressum.html | 0 {website/templates => templates}/index.html | 0 {website/templates => templates}/layout.html | 0 {website/templates => templates}/login.html | 0 {website/templates => templates}/mindmap.html | 0 .../templates => templates}/my_account.html | 0 {website/templates => templates}/profile.html | 0 .../templates => templates}/register.html | 0 {website/templates => templates}/search.html | 0 .../templates => templates}/settings.html | 0 {website/utils => utils}/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin .../__pycache__/db_fix.cpython-311.pyc | Bin .../__pycache__/db_rebuild.cpython-311.pyc | Bin .../__pycache__/db_test.cpython-311.pyc | Bin .../__pycache__/server.cpython-311.pyc | Bin .../__pycache__/user_manager.cpython-311.pyc | Bin {website/utils => utils}/db_fix.py | 0 {website/utils => utils}/db_rebuild.py | 0 {website/utils => utils}/db_test.py | 0 {website/utils => utils}/server.py | 0 {website/utils => utils}/user_manager.py | 0 website/README.md | 134 ------------- website/__pycache__/app.cpython-311.pyc | Bin 54093 -> 0 bytes website/__pycache__/app.cpython-313.pyc | Bin 43233 -> 0 bytes website/__pycache__/init_db.cpython-311.pyc | Bin 11142 -> 0 bytes website/__pycache__/init_db.cpython-313.pyc | Bin 4848 -> 0 bytes website/__pycache__/models.cpython-311.pyc | Bin 18555 -> 0 bytes website/requirements.txt | 14 -- website/run.py | 33 ---- website/setup.sh | 52 ----- 77 files changed, 110 insertions(+), 552 deletions(-) rename website/.env => .env (100%) delete mode 100644 Dockerfile rename website/ROADMAP.md => ROADMAP.md (100%) rename website/TOOLS.py => TOOLS.py (100%) rename website/app.py => app.py (100%) rename website/cookies.txt => cookies.txt (100%) delete mode 100644 copy-network-image.bat rename {website/database => database}/systades.db (100%) rename {website/database => database}/systades.db.backup (100%) delete mode 100755 deploy.py delete mode 100755 deploy.sh delete mode 100644 docker-compose.yml rename ANLEITUNG.md => docs/ANLEITUNG.md (100%) rename Grundstruktur (funktionales Modell).pdf => docs/Grundstruktur (funktionales Modell).pdf (100%) rename website/example.env => example.env (100%) rename website/init_db.py => init_db.py (100%) rename website/models.py => models.py (100%) delete mode 100755 setup.py rename {website/static => static}/background.js (100%) rename {website/static => static}/background.mp4 (100%) rename {website/static => static}/css/assistant.css (100%) rename {website/static => static}/css/base-styles.css (100%) rename {website/static => static}/css/main.css (100%) rename {website/static => static}/css/src/input.css (100%) rename {website/static => static}/css/style.css (100%) rename {website/static => static}/d3-extensions.js (100%) rename {website/static => static}/img/favicon-gen.py (100%) rename {website/static => static}/img/favicon.svg (100%) rename {website/static => static}/js/main.js (100%) rename {website/static => static}/js/modules/chatgpt-assistant.js (100%) rename {website/static => static}/js/modules/mindmap-page.js (100%) rename {website/static => static}/js/modules/mindmap.js (100%) rename {website/static => static}/mindmap.js (100%) rename {website/static => static}/network-animation.js (100%) rename {website/static => static}/network-background.js (100%) rename {website/static => static}/three.min.js (100%) rename website/tailwind.config.js => tailwind.config.js (100%) rename {website/templates => templates}/admin.html (100%) rename {website/templates => templates}/agb.html (100%) rename {website/templates => templates}/base.html (100%) rename {website/templates => templates}/datenschutz.html (100%) rename {website/templates => templates}/errors/403.html (100%) rename {website/templates => templates}/errors/404.html (100%) rename {website/templates => templates}/errors/429.html (100%) rename {website/templates => templates}/errors/500.html (100%) rename {website/templates => templates}/impressum.html (100%) rename {website/templates => templates}/index.html (100%) rename {website/templates => templates}/layout.html (100%) rename {website/templates => templates}/login.html (100%) rename {website/templates => templates}/mindmap.html (100%) rename {website/templates => templates}/my_account.html (100%) rename {website/templates => templates}/profile.html (100%) rename {website/templates => templates}/register.html (100%) rename {website/templates => templates}/search.html (100%) rename {website/templates => templates}/settings.html (100%) rename {website/utils => utils}/__init__.py (100%) rename {website/utils => utils}/__pycache__/__init__.cpython-311.pyc (100%) rename {website/utils => utils}/__pycache__/db_fix.cpython-311.pyc (100%) rename {website/utils => utils}/__pycache__/db_rebuild.cpython-311.pyc (100%) rename {website/utils => utils}/__pycache__/db_test.cpython-311.pyc (100%) rename {website/utils => utils}/__pycache__/server.cpython-311.pyc (100%) rename {website/utils => utils}/__pycache__/user_manager.cpython-311.pyc (100%) rename {website/utils => utils}/db_fix.py (100%) rename {website/utils => utils}/db_rebuild.py (100%) rename {website/utils => utils}/db_test.py (100%) rename {website/utils => utils}/server.py (100%) rename {website/utils => utils}/user_manager.py (100%) delete mode 100644 website/README.md delete mode 100644 website/__pycache__/app.cpython-311.pyc delete mode 100644 website/__pycache__/app.cpython-313.pyc delete mode 100644 website/__pycache__/init_db.cpython-311.pyc delete mode 100644 website/__pycache__/init_db.cpython-313.pyc delete mode 100644 website/__pycache__/models.cpython-311.pyc delete mode 100644 website/requirements.txt delete mode 100755 website/run.py delete mode 100755 website/setup.sh diff --git a/website/.env b/.env similarity index 100% rename from website/.env rename to .env diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 5780a0b..0000000 --- a/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM python:3.9-slim-buster - -WORKDIR /app - -COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt - -COPY website . - -CMD ["python", "app.py"] \ No newline at end of file diff --git a/README.md b/README.md index cd107f9..cf56801 100644 --- a/README.md +++ b/README.md @@ -1,94 +1,134 @@ -# MindMap Wissensnetzwerk +# MindMapProjekt - Roadmap -Eine interaktive Plattform zum Visualisieren, Erforschen und Teilen von Wissen mit integriertem ChatGPT-Assistenten. +## Projektübersicht +Das MindMapProjekt ist eine interaktive Plattform zum Visualisieren, Erforschen und Teilen von Wissen. Das Projekt wird umfassend überarbeitet, um ein modernes, benutzerfreundliches Design und erweiterte Funktionalitäten zu bieten. -## Features +## Technischer Stack +- **Backend**: Python/Flask +- **Frontend**: + - Tailwind CSS für moderne UI + - SVG-Bibliotheken für Visualisierungen (D3.js) + - JavaScript/Alpine.js für interaktive Komponenten +- **Datenbank**: SQLite mit SQLAlchemy +- **KI-Integration**: OpenAI API für intelligente Assistenz -- Interaktive Mindmap zur Visualisierung von Wissensverbindungen -- Gedanken mit verschiedenen Beziehungstypen verknüpfen -- Suchfunktion für Gedanken und Verbindungen -- Bewertungssystem für Gedanken -- Dark/Light Mode -- **Integrierter KI-Assistent** mit OpenAI GPT-Integration +## Installation und Verwendung -## Installation +### Installation +1. Repository klonen +2. Virtuelle Umgebung erstellen: `python -m venv venv` +3. Virtuelle Umgebung aktivieren: + - Windows: `venv\Scripts\activate` + - Unix/MacOS: `source venv/bin/activate` +4. Abhängigkeiten installieren: `pip install -r requirements.txt` +5. Datenbank initialisieren: `python TOOLS.py db:rebuild` +6. Admin-Benutzer erstellen: `python TOOLS.py user:admin` +7. Server starten: `python TOOLS.py server:run` -### Einfache Installation +### Standardbenutzer +- **Admin-Benutzer**: Username: `admin` / Passwort: `admin` +- **Testbenutzer**: Username: `user` / Passwort: `user` -Führe im übergeordneten Verzeichnis folgendes aus: +### Verwaltungswerkzeuge mit TOOLS.py +Das Projekt enthält ein zentrales Verwaltungsskript `TOOLS.py`, das verschiedene Hilfsfunktionen bietet: -``` -python setup.py -``` +#### Datenbankverwaltung +- `python TOOLS.py db:fix` - Reparieren der Datenbankstruktur +- `python TOOLS.py db:rebuild` - Datenbank neu aufbauen (löscht alle Daten!) +- `python TOOLS.py db:test` - Datenbankverbindung und Modelle testen +- `python TOOLS.py db:stats` - Datenbankstatistiken anzeigen -Dies erstellt eine virtuelle Umgebung, installiert alle Abhängigkeiten und erstellt die CSS-Dateien mit Tailwind. +#### Benutzerverwaltung +- `python TOOLS.py user:list` - Alle Benutzer anzeigen +- `python TOOLS.py user:create -u USERNAME -e EMAIL -p PASSWORD [-a]` - Neuen Benutzer erstellen +- `python TOOLS.py user:admin` - Admin-Benutzer erstellen (admin/admin) +- `python TOOLS.py user:reset-pw -u USERNAME -p NEWPASSWORD` - Benutzerpasswort zurücksetzen +- `python TOOLS.py user:delete -u USERNAME` - Benutzer löschen -### Manuelle Installation +#### Serververwaltung +- `python TOOLS.py server:run [--host HOST] [--port PORT] [--no-debug]` - Entwicklungsserver starten -1. Repository klonen: - ``` - git clone - ``` +Für detaillierte Hilfe: `python TOOLS.py -h` -2. Python-Abhängigkeiten installieren: - ``` - cd website - pip install -r requirements.txt - ``` +## Roadmap der Überarbeitung -3. Environment-Variablen konfigurieren: - ``` - cp example.env .env - ``` - Bearbeite die `.env`-Datei und füge deinen OpenAI API-Schlüssel ein. +### Phase 1: Grundlegende Infrastruktur ✅ +- [x] Bestandsaufnahme des aktuellen Projekts +- [x] Erstellung der Roadmap +- [x] Aktualisierung der Abhängigkeiten +- [x] Integration von Tailwind CSS +- [x] Einrichtung der SVG-Bibliotheken (D3.js) +- [x] Favicon erstellen +- [x] Setup-Skript für einfache Installation -4. CSS mit Tailwind erstellen: - ``` - python build_css.py - ``` +### Phase 2: Design-Überarbeitung 🔄 +- [x] Implementierung des Dark Mode +- [x] Erstellung eines modernen, minimalistischen UI mit Tech-Ästhetik +- [x] Responsive Design für alle Geräte +- [ ] Gestaltung der Landing Page mit großer Typografie -5. Datenbank initialisieren: - ``` - python init_db.py - ``` +### Phase 3: Mindmap-Funktionalitäten 🔄 +- [x] Verbesserte Visualisierung mit SVG und D3.js +- [x] Implementierung der Mouseover-Funktion +- [x] Entwicklung der Suchfunktion für Knoten +- [ ] Tagging-System für Inhalte +- [ ] Quellenmanagement und -verlinkung +- [ ] Upload-Funktionalität an Knotenpunkten -6. Anwendung starten: - ``` - python run.py - ``` +### Phase 4: Kernseitenentwicklung +- [ ] Überarbeitung der Startseite mit neuen Features +- [ ] Entwicklung der "Wer sind wir?"-Seite +- [ ] Implementierung von Impressum und Datenschutzerklärung +- [ ] Erstellung der Kontaktseite mit FAQs +- [ ] Überarbeitung des Benutzerprofilbereichs -## Entwicklung +### Phase 5: Community-Features +- [ ] Entwicklung des Autorenbereichs +- [ ] Implementierung von Community-Bereichen für Themenbereiche +- [ ] Verbesserter Kommentarbereich +- [ ] Benutzerrechtemanagement -Für die Entwicklung mit automatischem CSS-Reload: +### Phase 6: KI-Integration +- [ ] Implementierung des Frage-Antwort-Systems +- [ ] KI-generierte Themeneinleitungen +- [ ] Intelligente Suchunterstützung +- [ ] Geführte Pfade durch Themenbereiche +- [ ] Vorgeschlagene Chat-Möglichkeiten -``` -python dev.py -``` +### Phase 7: Benutzerprofilfunktionen +- [ ] Speichern von Thematiken +- [ ] Persönliche Mindmap/Pinboard +- [ ] Beitragsmanagement +- [ ] Benutzerstatistiken und -aktivitäten -Dieser Befehl startet sowohl den Flask-Server als auch den Tailwind CSS-Watcher, der CSS bei Änderungen automatisch neu generiert. +### Phase 8: Testing und Optimierung +- [ ] Umfassende Tests aller Funktionen +- [ ] Performance-Optimierung +- [ ] SEO-Implementierung +- [ ] Barrierefreiheit prüfen und verbessern -## Verwendung des KI-Assistenten +### Phase 9: Dokumentation und Einführung +- [ ] Erstellung von Benutzeranleitungen +- [ ] Entwicklerdokumentation +- [ ] Administratorenhandbuch +- [ ] Guided Tour für neue Benutzer -Der KI-Assistent ist über folgende Wege zugänglich: +## Aktueller Status +- **Phase 1**: ✅ Abgeschlossen +- **Phase 2**: 🔄 In Bearbeitung (75% abgeschlossen) +- **Phase 3**: 🔄 In Bearbeitung (50% abgeschlossen) -1. **Schwebende Schaltfläche**: In der unteren rechten Ecke der Webseite ist eine Roboter-Schaltfläche, die den Assistenten öffnet. -2. **Navigation**: In der Hauptnavigation gibt es ebenfalls eine Schaltfläche mit Roboter-Symbol. -3. **Startseite**: Im "KI-Assistent"-Abschnitt auf der Startseite gibt es einen "KI-Chat starten"-Button. +## Aktuelle Fortschritte +- Grundlegende UI modernisiert mit Tailwind CSS und Dark Mode +- Neues Favicon für bessere visuelle Identität erstellt +- Setup-Prozess vereinfacht mit einem Shell-Skript +- Mindmap-Visualisierung komplett überarbeitet mit D3.js für eine interaktivere Erfahrung +- Responsive Design für optimale Darstellung auf allen Geräten -Der Assistent kann bei folgenden Aufgaben helfen: +## Nächste Schritte +- Fertigstellung der Landing Page +- Erstellung der "Wer sind wir?"-Seite +- Implementierung des Tagging-Systems für Gedanken +- Verbesserung der Gedankenansicht im Mindmap-Bereich -- Erklärung von Themen und Konzepten -- Suche nach Verbindungen zwischen Gedanken -- Beantwortung von Fragen zur Plattform -- Vorschläge für neue Gedankenverbindungen - -## Technologie-Stack - -- **Backend**: Flask, SQLAlchemy -- **Frontend**: HTML, CSS, JavaScript, Tailwind CSS (ohne npm), Alpine.js -- **KI**: OpenAI GPT API -- **Datenbank**: SQLite (Standard), kann auf andere Datenbanken umgestellt werden - -## Konfiguration - -Die Anwendung kann über Umgebungsvariablen konfiguriert werden. Siehe `example.env` für verfügbare Optionen. \ No newline at end of file +*Zuletzt aktualisiert: 01.06.2024* \ No newline at end of file diff --git a/website/ROADMAP.md b/ROADMAP.md similarity index 100% rename from website/ROADMAP.md rename to ROADMAP.md diff --git a/website/TOOLS.py b/TOOLS.py similarity index 100% rename from website/TOOLS.py rename to TOOLS.py diff --git a/website/app.py b/app.py similarity index 100% rename from website/app.py rename to app.py diff --git a/website/cookies.txt b/cookies.txt similarity index 100% rename from website/cookies.txt rename to cookies.txt diff --git a/copy-network-image.bat b/copy-network-image.bat deleted file mode 100644 index b445827..0000000 --- a/copy-network-image.bat +++ /dev/null @@ -1,33 +0,0 @@ -@echo off -echo Copying network image to website/static/network-bg.jpg... - -if not exist "website\static" ( - echo Error: website/static directory does not exist. - echo Make sure you are running this script from the main project directory. - pause - exit /b 1 -) - -if "%~1"=="" ( - echo Usage: copy-network-image.bat [path_to_image] - echo Example: copy-network-image.bat d2efd014-1325-471f-b9a7-90d025eb81d6.png - pause - exit /b 1 -) - -if not exist "%~1" ( - echo Error: The specified image file "%~1" does not exist. - pause - exit /b 1 -) - -copy /Y "%~1" "website\static\network-bg.jpg" > nul - -if %errorlevel% equ 0 ( - echo Success! The image has been copied to website/static/network-bg.jpg - echo Please restart the Flask server to see the changes. -) else ( - echo Error: Failed to copy the image. -) - -pause \ No newline at end of file diff --git a/website/database/systades.db b/database/systades.db similarity index 100% rename from website/database/systades.db rename to database/systades.db diff --git a/website/database/systades.db.backup b/database/systades.db.backup similarity index 100% rename from website/database/systades.db.backup rename to database/systades.db.backup diff --git a/deploy.py b/deploy.py deleted file mode 100755 index 81a929e..0000000 --- a/deploy.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python3 -import os -import subprocess -import sys -import shutil -from pathlib import Path - -def main(): - """Deploy the website on a server""" - print("Deploying the website on the server...") - - # Get the directory where deploy.py is located (project root) - project_root = Path(__file__).resolve().parent - website_dir = project_root / "website" - - # Check if virtual environment exists, create if not - venv_dir = project_root / "venv" - if not venv_dir.exists(): - print("Creating virtual environment...") - subprocess.run([sys.executable, "-m", "venv", str(venv_dir)], check=True) - - # Determine Python and pip paths based on OS - if os.name == 'nt': # Windows - python = venv_dir / "Scripts" / "python" - pip = venv_dir / "Scripts" / "pip" - else: # Unix-like - python = venv_dir / "bin" / "python" - pip = venv_dir / "bin" / "pip" - - # Install dependencies - print("Installing dependencies...") - subprocess.run([str(pip), "install", "-r", str(website_dir / "requirements.txt")], check=True) - subprocess.run([str(pip), "install", "gunicorn"], check=True) - - # Build CSS - print("Building CSS with Tailwind...") - subprocess.run([str(python), str(website_dir / "build_css.py")], check=True) - - # Create a systemd service file - service_file = """[Unit] -Description=MindMap Wissensnetzwerk -After=network.target - -[Service] -User=www-data -WorkingDirectory={website_dir} -Environment="PATH={venv_bin}" -ExecStart={gunicorn} --workers 3 --bind 0.0.0.0:5000 --log-level info 'run:app' -Restart=always - -[Install] -WantedBy=multi-user.target -""".format( - website_dir=website_dir, - venv_bin=venv_dir / "bin", - gunicorn=venv_dir / "bin" / "gunicorn" - ) - - service_path = project_root / "mindmap.service" - with open(service_path, 'w') as f: - f.write(service_file) - - print(f""" -Deployment files created! - -To install the service on a Linux server: -1. Copy the systemd service file: - sudo cp {service_path} /etc/systemd/system/ - -2. Reload systemd: - sudo systemctl daemon-reload - -3. Enable and start the service: - sudo systemctl enable mindmap.service - sudo systemctl start mindmap.service - -4. Check service status: - sudo systemctl status mindmap.service - -Alternatively, you can run the application with gunicorn manually: -cd {website_dir} -{venv_dir}/bin/gunicorn --workers 3 --bind 0.0.0.0:5000 'run:app' -""") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index 7c8672f..0000000 --- a/deploy.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# Farben für Ausgaben -GREEN='\033[0;32m' -BLUE='\033[0;34m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -echo -e "${GREEN}==== MindMap Projekt Server Deployment ====${NC}" - -# Python-Umgebung erstellen -echo -e "${BLUE}Erstelle Python-Umgebung...${NC}" -python3 -m venv venv -source venv/bin/activate - -# Python-Abhängigkeiten installieren -echo -e "${BLUE}Installiere Python-Abhängigkeiten...${NC}" -pip install -r website/requirements.txt -pip install gunicorn - -# Tailwind CSS kompilieren -echo -e "${BLUE}Kompiliere Tailwind CSS...${NC}" -cd website -python build_css.py -cd .. - -# Datenbank initialisieren, falls noch nicht vorhanden -echo -e "${BLUE}Initialisiere die Datenbank, falls nötig...${NC}" -cd website -python init_db.py -cd .. - -# Systemd Service erstellen -echo -e "${BLUE}Erstelle Systemd Service...${NC}" -SERVICE_FILE="[Unit] -Description=MindMap Wissensnetzwerk -After=network.target - -[Service] -User=$(whoami) -WorkingDirectory=$(pwd)/website -Environment=\"PATH=$(pwd)/venv/bin\" -ExecStart=$(pwd)/venv/bin/gunicorn --workers 3 --bind 0.0.0.0:5000 --log-level info 'run:app' -Restart=always - -[Install] -WantedBy=multi-user.target" - -echo "$SERVICE_FILE" > mindmap.service - -echo -e "${GREEN}==== Deployment abgeschlossen ====${NC}" -echo -e "${BLUE}Um den Service zu installieren, führe folgende Befehle aus:${NC}" -echo -e "sudo cp mindmap.service /etc/systemd/system/" -echo -e "sudo systemctl daemon-reload" -echo -e "sudo systemctl enable mindmap.service" -echo -e "sudo systemctl start mindmap.service" -echo -e "" -echo -e "${BLUE}Alternativ kannst du den Server manuell starten:${NC}" -echo -e "cd website" -echo -e "../venv/bin/gunicorn --workers 3 --bind 0.0.0.0:5000 'run:app'" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index c2faf8f..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: "3.9" -services: - web: - build: . - ports: - - "5000:5000" - restart: always \ No newline at end of file diff --git a/ANLEITUNG.md b/docs/ANLEITUNG.md similarity index 100% rename from ANLEITUNG.md rename to docs/ANLEITUNG.md diff --git a/Grundstruktur (funktionales Modell).pdf b/docs/Grundstruktur (funktionales Modell).pdf similarity index 100% rename from Grundstruktur (funktionales Modell).pdf rename to docs/Grundstruktur (funktionales Modell).pdf diff --git a/website/example.env b/example.env similarity index 100% rename from website/example.env rename to example.env diff --git a/website/init_db.py b/init_db.py similarity index 100% rename from website/init_db.py rename to init_db.py diff --git a/website/models.py b/models.py similarity index 100% rename from website/models.py rename to models.py diff --git a/setup.py b/setup.py deleted file mode 100755 index e8b922f..0000000 --- a/setup.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python3 -import os -import subprocess -import sys -from pathlib import Path - -def main(): - """Set up the project from the parent directory""" - print("Setting up the project...") - - # Get the directory where setup.py is located (project root) - project_root = Path(__file__).resolve().parent - website_dir = project_root / "website" - - # Check if virtual environment exists, create if not - venv_dir = project_root / "venv" - if not venv_dir.exists(): - print("Creating virtual environment...") - subprocess.run([sys.executable, "-m", "venv", str(venv_dir)], check=True) - - # Determine pip path based on OS - if os.name == 'nt': # Windows - pip = venv_dir / "Scripts" / "pip" - else: # Unix-like - pip = venv_dir / "bin" / "pip" - - # Install dependencies - print("Installing dependencies...") - subprocess.run([str(pip), "install", "-r", str(website_dir / "requirements.txt")], check=True) - - # Build CSS - print("Building CSS with Tailwind...") - if os.name == 'nt': # Windows - python = venv_dir / "Scripts" / "python" - else: # Unix-like - python = venv_dir / "bin" / "python" - - subprocess.run([str(python), str(website_dir / "build_css.py")], check=True) - - print(""" -Setup completed successfully! - -To run the development server: -1. Activate the virtual environment: - - Windows: .\\venv\\Scripts\\activate - - Unix/MacOS: source venv/bin/activate -2. Run the Flask application: - - cd website - - python run.py - """) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/website/static/background.js b/static/background.js similarity index 100% rename from website/static/background.js rename to static/background.js diff --git a/website/static/background.mp4 b/static/background.mp4 similarity index 100% rename from website/static/background.mp4 rename to static/background.mp4 diff --git a/website/static/css/assistant.css b/static/css/assistant.css similarity index 100% rename from website/static/css/assistant.css rename to static/css/assistant.css diff --git a/website/static/css/base-styles.css b/static/css/base-styles.css similarity index 100% rename from website/static/css/base-styles.css rename to static/css/base-styles.css diff --git a/website/static/css/main.css b/static/css/main.css similarity index 100% rename from website/static/css/main.css rename to static/css/main.css diff --git a/website/static/css/src/input.css b/static/css/src/input.css similarity index 100% rename from website/static/css/src/input.css rename to static/css/src/input.css diff --git a/website/static/css/style.css b/static/css/style.css similarity index 100% rename from website/static/css/style.css rename to static/css/style.css diff --git a/website/static/d3-extensions.js b/static/d3-extensions.js similarity index 100% rename from website/static/d3-extensions.js rename to static/d3-extensions.js diff --git a/website/static/img/favicon-gen.py b/static/img/favicon-gen.py similarity index 100% rename from website/static/img/favicon-gen.py rename to static/img/favicon-gen.py diff --git a/website/static/img/favicon.svg b/static/img/favicon.svg similarity index 100% rename from website/static/img/favicon.svg rename to static/img/favicon.svg diff --git a/website/static/js/main.js b/static/js/main.js similarity index 100% rename from website/static/js/main.js rename to static/js/main.js diff --git a/website/static/js/modules/chatgpt-assistant.js b/static/js/modules/chatgpt-assistant.js similarity index 100% rename from website/static/js/modules/chatgpt-assistant.js rename to static/js/modules/chatgpt-assistant.js diff --git a/website/static/js/modules/mindmap-page.js b/static/js/modules/mindmap-page.js similarity index 100% rename from website/static/js/modules/mindmap-page.js rename to static/js/modules/mindmap-page.js diff --git a/website/static/js/modules/mindmap.js b/static/js/modules/mindmap.js similarity index 100% rename from website/static/js/modules/mindmap.js rename to static/js/modules/mindmap.js diff --git a/website/static/mindmap.js b/static/mindmap.js similarity index 100% rename from website/static/mindmap.js rename to static/mindmap.js diff --git a/website/static/network-animation.js b/static/network-animation.js similarity index 100% rename from website/static/network-animation.js rename to static/network-animation.js diff --git a/website/static/network-background.js b/static/network-background.js similarity index 100% rename from website/static/network-background.js rename to static/network-background.js diff --git a/website/static/three.min.js b/static/three.min.js similarity index 100% rename from website/static/three.min.js rename to static/three.min.js diff --git a/website/tailwind.config.js b/tailwind.config.js similarity index 100% rename from website/tailwind.config.js rename to tailwind.config.js diff --git a/website/templates/admin.html b/templates/admin.html similarity index 100% rename from website/templates/admin.html rename to templates/admin.html diff --git a/website/templates/agb.html b/templates/agb.html similarity index 100% rename from website/templates/agb.html rename to templates/agb.html diff --git a/website/templates/base.html b/templates/base.html similarity index 100% rename from website/templates/base.html rename to templates/base.html diff --git a/website/templates/datenschutz.html b/templates/datenschutz.html similarity index 100% rename from website/templates/datenschutz.html rename to templates/datenschutz.html diff --git a/website/templates/errors/403.html b/templates/errors/403.html similarity index 100% rename from website/templates/errors/403.html rename to templates/errors/403.html diff --git a/website/templates/errors/404.html b/templates/errors/404.html similarity index 100% rename from website/templates/errors/404.html rename to templates/errors/404.html diff --git a/website/templates/errors/429.html b/templates/errors/429.html similarity index 100% rename from website/templates/errors/429.html rename to templates/errors/429.html diff --git a/website/templates/errors/500.html b/templates/errors/500.html similarity index 100% rename from website/templates/errors/500.html rename to templates/errors/500.html diff --git a/website/templates/impressum.html b/templates/impressum.html similarity index 100% rename from website/templates/impressum.html rename to templates/impressum.html diff --git a/website/templates/index.html b/templates/index.html similarity index 100% rename from website/templates/index.html rename to templates/index.html diff --git a/website/templates/layout.html b/templates/layout.html similarity index 100% rename from website/templates/layout.html rename to templates/layout.html diff --git a/website/templates/login.html b/templates/login.html similarity index 100% rename from website/templates/login.html rename to templates/login.html diff --git a/website/templates/mindmap.html b/templates/mindmap.html similarity index 100% rename from website/templates/mindmap.html rename to templates/mindmap.html diff --git a/website/templates/my_account.html b/templates/my_account.html similarity index 100% rename from website/templates/my_account.html rename to templates/my_account.html diff --git a/website/templates/profile.html b/templates/profile.html similarity index 100% rename from website/templates/profile.html rename to templates/profile.html diff --git a/website/templates/register.html b/templates/register.html similarity index 100% rename from website/templates/register.html rename to templates/register.html diff --git a/website/templates/search.html b/templates/search.html similarity index 100% rename from website/templates/search.html rename to templates/search.html diff --git a/website/templates/settings.html b/templates/settings.html similarity index 100% rename from website/templates/settings.html rename to templates/settings.html diff --git a/website/utils/__init__.py b/utils/__init__.py similarity index 100% rename from website/utils/__init__.py rename to utils/__init__.py diff --git a/website/utils/__pycache__/__init__.cpython-311.pyc b/utils/__pycache__/__init__.cpython-311.pyc similarity index 100% rename from website/utils/__pycache__/__init__.cpython-311.pyc rename to utils/__pycache__/__init__.cpython-311.pyc diff --git a/website/utils/__pycache__/db_fix.cpython-311.pyc b/utils/__pycache__/db_fix.cpython-311.pyc similarity index 100% rename from website/utils/__pycache__/db_fix.cpython-311.pyc rename to utils/__pycache__/db_fix.cpython-311.pyc diff --git a/website/utils/__pycache__/db_rebuild.cpython-311.pyc b/utils/__pycache__/db_rebuild.cpython-311.pyc similarity index 100% rename from website/utils/__pycache__/db_rebuild.cpython-311.pyc rename to utils/__pycache__/db_rebuild.cpython-311.pyc diff --git a/website/utils/__pycache__/db_test.cpython-311.pyc b/utils/__pycache__/db_test.cpython-311.pyc similarity index 100% rename from website/utils/__pycache__/db_test.cpython-311.pyc rename to utils/__pycache__/db_test.cpython-311.pyc diff --git a/website/utils/__pycache__/server.cpython-311.pyc b/utils/__pycache__/server.cpython-311.pyc similarity index 100% rename from website/utils/__pycache__/server.cpython-311.pyc rename to utils/__pycache__/server.cpython-311.pyc diff --git a/website/utils/__pycache__/user_manager.cpython-311.pyc b/utils/__pycache__/user_manager.cpython-311.pyc similarity index 100% rename from website/utils/__pycache__/user_manager.cpython-311.pyc rename to utils/__pycache__/user_manager.cpython-311.pyc diff --git a/website/utils/db_fix.py b/utils/db_fix.py similarity index 100% rename from website/utils/db_fix.py rename to utils/db_fix.py diff --git a/website/utils/db_rebuild.py b/utils/db_rebuild.py similarity index 100% rename from website/utils/db_rebuild.py rename to utils/db_rebuild.py diff --git a/website/utils/db_test.py b/utils/db_test.py similarity index 100% rename from website/utils/db_test.py rename to utils/db_test.py diff --git a/website/utils/server.py b/utils/server.py similarity index 100% rename from website/utils/server.py rename to utils/server.py diff --git a/website/utils/user_manager.py b/utils/user_manager.py similarity index 100% rename from website/utils/user_manager.py rename to utils/user_manager.py diff --git a/website/README.md b/website/README.md deleted file mode 100644 index cf56801..0000000 --- a/website/README.md +++ /dev/null @@ -1,134 +0,0 @@ -# MindMapProjekt - Roadmap - -## Projektübersicht -Das MindMapProjekt ist eine interaktive Plattform zum Visualisieren, Erforschen und Teilen von Wissen. Das Projekt wird umfassend überarbeitet, um ein modernes, benutzerfreundliches Design und erweiterte Funktionalitäten zu bieten. - -## Technischer Stack -- **Backend**: Python/Flask -- **Frontend**: - - Tailwind CSS für moderne UI - - SVG-Bibliotheken für Visualisierungen (D3.js) - - JavaScript/Alpine.js für interaktive Komponenten -- **Datenbank**: SQLite mit SQLAlchemy -- **KI-Integration**: OpenAI API für intelligente Assistenz - -## Installation und Verwendung - -### Installation -1. Repository klonen -2. Virtuelle Umgebung erstellen: `python -m venv venv` -3. Virtuelle Umgebung aktivieren: - - Windows: `venv\Scripts\activate` - - Unix/MacOS: `source venv/bin/activate` -4. Abhängigkeiten installieren: `pip install -r requirements.txt` -5. Datenbank initialisieren: `python TOOLS.py db:rebuild` -6. Admin-Benutzer erstellen: `python TOOLS.py user:admin` -7. Server starten: `python TOOLS.py server:run` - -### Standardbenutzer -- **Admin-Benutzer**: Username: `admin` / Passwort: `admin` -- **Testbenutzer**: Username: `user` / Passwort: `user` - -### Verwaltungswerkzeuge mit TOOLS.py -Das Projekt enthält ein zentrales Verwaltungsskript `TOOLS.py`, das verschiedene Hilfsfunktionen bietet: - -#### Datenbankverwaltung -- `python TOOLS.py db:fix` - Reparieren der Datenbankstruktur -- `python TOOLS.py db:rebuild` - Datenbank neu aufbauen (löscht alle Daten!) -- `python TOOLS.py db:test` - Datenbankverbindung und Modelle testen -- `python TOOLS.py db:stats` - Datenbankstatistiken anzeigen - -#### Benutzerverwaltung -- `python TOOLS.py user:list` - Alle Benutzer anzeigen -- `python TOOLS.py user:create -u USERNAME -e EMAIL -p PASSWORD [-a]` - Neuen Benutzer erstellen -- `python TOOLS.py user:admin` - Admin-Benutzer erstellen (admin/admin) -- `python TOOLS.py user:reset-pw -u USERNAME -p NEWPASSWORD` - Benutzerpasswort zurücksetzen -- `python TOOLS.py user:delete -u USERNAME` - Benutzer löschen - -#### Serververwaltung -- `python TOOLS.py server:run [--host HOST] [--port PORT] [--no-debug]` - Entwicklungsserver starten - -Für detaillierte Hilfe: `python TOOLS.py -h` - -## Roadmap der Überarbeitung - -### Phase 1: Grundlegende Infrastruktur ✅ -- [x] Bestandsaufnahme des aktuellen Projekts -- [x] Erstellung der Roadmap -- [x] Aktualisierung der Abhängigkeiten -- [x] Integration von Tailwind CSS -- [x] Einrichtung der SVG-Bibliotheken (D3.js) -- [x] Favicon erstellen -- [x] Setup-Skript für einfache Installation - -### Phase 2: Design-Überarbeitung 🔄 -- [x] Implementierung des Dark Mode -- [x] Erstellung eines modernen, minimalistischen UI mit Tech-Ästhetik -- [x] Responsive Design für alle Geräte -- [ ] Gestaltung der Landing Page mit großer Typografie - -### Phase 3: Mindmap-Funktionalitäten 🔄 -- [x] Verbesserte Visualisierung mit SVG und D3.js -- [x] Implementierung der Mouseover-Funktion -- [x] Entwicklung der Suchfunktion für Knoten -- [ ] Tagging-System für Inhalte -- [ ] Quellenmanagement und -verlinkung -- [ ] Upload-Funktionalität an Knotenpunkten - -### Phase 4: Kernseitenentwicklung -- [ ] Überarbeitung der Startseite mit neuen Features -- [ ] Entwicklung der "Wer sind wir?"-Seite -- [ ] Implementierung von Impressum und Datenschutzerklärung -- [ ] Erstellung der Kontaktseite mit FAQs -- [ ] Überarbeitung des Benutzerprofilbereichs - -### Phase 5: Community-Features -- [ ] Entwicklung des Autorenbereichs -- [ ] Implementierung von Community-Bereichen für Themenbereiche -- [ ] Verbesserter Kommentarbereich -- [ ] Benutzerrechtemanagement - -### Phase 6: KI-Integration -- [ ] Implementierung des Frage-Antwort-Systems -- [ ] KI-generierte Themeneinleitungen -- [ ] Intelligente Suchunterstützung -- [ ] Geführte Pfade durch Themenbereiche -- [ ] Vorgeschlagene Chat-Möglichkeiten - -### Phase 7: Benutzerprofilfunktionen -- [ ] Speichern von Thematiken -- [ ] Persönliche Mindmap/Pinboard -- [ ] Beitragsmanagement -- [ ] Benutzerstatistiken und -aktivitäten - -### Phase 8: Testing und Optimierung -- [ ] Umfassende Tests aller Funktionen -- [ ] Performance-Optimierung -- [ ] SEO-Implementierung -- [ ] Barrierefreiheit prüfen und verbessern - -### Phase 9: Dokumentation und Einführung -- [ ] Erstellung von Benutzeranleitungen -- [ ] Entwicklerdokumentation -- [ ] Administratorenhandbuch -- [ ] Guided Tour für neue Benutzer - -## Aktueller Status -- **Phase 1**: ✅ Abgeschlossen -- **Phase 2**: 🔄 In Bearbeitung (75% abgeschlossen) -- **Phase 3**: 🔄 In Bearbeitung (50% abgeschlossen) - -## Aktuelle Fortschritte -- Grundlegende UI modernisiert mit Tailwind CSS und Dark Mode -- Neues Favicon für bessere visuelle Identität erstellt -- Setup-Prozess vereinfacht mit einem Shell-Skript -- Mindmap-Visualisierung komplett überarbeitet mit D3.js für eine interaktivere Erfahrung -- Responsive Design für optimale Darstellung auf allen Geräten - -## Nächste Schritte -- Fertigstellung der Landing Page -- Erstellung der "Wer sind wir?"-Seite -- Implementierung des Tagging-Systems für Gedanken -- Verbesserung der Gedankenansicht im Mindmap-Bereich - -*Zuletzt aktualisiert: 01.06.2024* \ No newline at end of file diff --git a/website/__pycache__/app.cpython-311.pyc b/website/__pycache__/app.cpython-311.pyc deleted file mode 100644 index 96ab4434503767c750d0d09004ccb54b4e9ad9de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54093 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 diff --git a/website/__pycache__/app.cpython-313.pyc b/website/__pycache__/app.cpython-313.pyc deleted file mode 100644 index 65fe9b4e7f8bd4059fd858d3aa674f0cae35d425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43233 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�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 diff --git a/website/__pycache__/models.cpython-311.pyc b/website/__pycache__/models.cpython-311.pyc deleted file mode 100644 index de860a6cb33b8933bbfa5840840b5b145e46a5ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18555 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