Compare commits

...

23 Commits

Author SHA1 Message Date
a7bb9563b3 hintergrund Fixes 2025-04-29 20:49:43 +01:00
4e0c470663 Update compiled Python files in __pycache__ for utils module 2025-04-29 20:38:00 +01:00
b5300f74bd Update compiled Python files in __pycache__ for models and utils modules 2025-04-29 20:35:23 +01:00
6a53e621ca ''Über Uns'' 2025-04-29 20:31:02 +01:00
a59ce652af Impressum 2025-04-29 19:26:35 +01:00
27cfc95081 Merge branch 'tills-branch' of https://git.clickcandit.com/marwinm/website into tills-branch 2025-04-29 20:24:41 +02:00
c513666391 Refactor nodeCount to config object" Explanation: This commit message follows the Conventional C... 2025-04-29 20:11:43 +02:00
ae30dbce57 Flask Fix JAHAH 2025-04-29 19:08:49 +01:00
817ddd98e9 chore: Änderungen commited 2025-04-29 20:08:12 +02:00
bfce2fc7b7 chore: Änderungen commited 2025-04-29 20:06:29 +02:00
efbcd567ee chore: Änderungen commited 2025-04-29 20:04:32 +02:00
a873765d08 feat: Implement smooth animation with adjustable pulse and flow speeds 2025-04-29 20:02:51 +02:00
efbcadb95a chore: Änderungen commited 2025-04-29 20:00:58 +02:00
da3ccaffe9 Refactor nodeCount configuration in NeuralNetworkBackground.js 2025-04-29 19:59:09 +02:00
f4e04573bd chore: Änderungen commited 2025-04-29 19:57:44 +02:00
aa253f3871 chore: Änderungen commited 2025-04-29 19:27:29 +02:00
cfd6a25b21 📝 Commit Message: "Refactor app module binary files using Conventional Commits (feat)" Explanat... 2025-04-29 19:25:18 +02:00
d307763007 Aktualisiere die Konfiguration der neuronalen Netzwerk-Hintergrundanimation in neural-network-background.js, um die Anzahl der Knoten, Variationen, Geschwindigkeiten und Sichtbarkeiten anzupassen. Füge neue Parameter für aktive Flows und Flussweiterleitung hinzu, um die Animation dynamischer zu gestalten. Optimiere die Logik zur Verwaltung aktiver Flows und verbessere die Sichtbarkeit von Verbindungen für ein flüssigeres Benutzererlebnis. 2025-04-29 15:19:33 +02:00
d7e6912e08 Aktualisiere die Umgebungsvariablen in .env mit neuen Werten für SECRET_KEY und OPENAI_API_KEY. Entferne die alte Instanz von systades.db und aktualisiere die neuronale Netzwerk-Hintergrundanimation in neural-network-background.js mit verbesserten visuellen Effekten, einschließlich einer neuen Zickzack-Bewegung für Blitze und subtileren Glüheffekten. Implementiere eine sanftere Ausblendanimation für das Canvas-Element und verbessere die Funkenanimationen. Optimiere die Cluster-Generierung und -Verteilung für eine flüssigere Benutzererfahrung. 2025-04-29 14:58:54 +02:00
ffe96074f4 Verbessere die Funktionalität des neuronalen Netzwerk-Hintergrunds in neural-network-background.js durch die Einführung einer flexiblen Konfigurationsstruktur, die benutzerdefinierte Optionen unterstützt. Optimiere die Cluster-Generierung und -Verteilung, verbessere die Verbindungslogik zwischen Knoten und implementiere erweiterte Fehlerbehandlung in den API-Funktionen in mindmap.js. Füge Fallback-Knoten hinzu, um die Benutzererfahrung zu verbessern, und implementiere visuelle Rückmeldungen für die Initialisierung der Mindmap. 2025-04-29 12:32:18 +02:00
49ccf3908a Merge remote-tracking branch 'origin/tills-branch' into tills-branch 2025-04-29 10:28:36 +02:00
9514645904 keine ahnung ehrlich 2025-04-29 10:28:15 +02:00
63f45abb3e background, mindmap 2025-04-29 10:27:07 +02:00
27 changed files with 1642 additions and 359 deletions

15
.env
View File

@@ -1,13 +1,2 @@
# MindMap Umgebungsvariablen
# Kopiere diese Datei zu .env und passe die Werte an
# Flask
SECRET_KEY=dein-geheimer-schluessel-hier
# OpenAI API
OPENAI_API_KEY=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
# Datenbank
# Bei Bedarf kann hier eine andere Datenbank-URL angegeben werden
# Der Pfad wird relativ zum Projektverzeichnis angegeben
# SQLALCHEMY_DATABASE_URI=sqlite:////absoluter/pfad/zu/database/systades.db OPENAI_API_KEY=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
SECRET_KEY=eed9298856dc9363cd32778265780d6904ba24e6a6b815a2cc382bcdd767ea7b
OPENAI_API_KEY=sk-dein-openai-api-schluessel-hier

8
.vscode/jsconfig.json vendored Normal file
View File

@@ -0,0 +1,8 @@
{
"compilerOptions": {
"target": "esnext",
"lib": [
"esnext"
]
}
}

68
.vscode/main.js vendored Normal file
View File

@@ -0,0 +1,68 @@
/// <reference types="vscode" />
// @ts-check
// API: https://code.visualstudio.com/api/references/vscode-api
// @ts-ignore
const vscode = require('vscode');
* @typedef {import('vscode').ExtensionContext} ExtensionContext
* @typedef {import('vscode').commands} commands
* @typedef {import('vscode').window} window
* @typedef {import('vscode').TextEditor} TextEditor
* @typedef {import('vscode').TextDocument} TextDocument
*/
/**
* Aktiviert die Erweiterung und registriert den Auto-Resume-Befehl
* @param {vscode.ExtensionContext} context - Der Erweiterungskontext
*/
function activate(context) {
const disposable = vscode.commands.registerCommand('extension.autoResume', () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const document = editor.document;
const text = document.getText();
// Track last click time to avoid multiple clicks
let lastClickTime = 0;
// Main function that looks for and clicks the resume link
function clickResumeLink() {
// Prevent clicking too frequently (3 second cooldown)
const now = Date.now();
if (now - lastClickTime < 3000) return;
// Check if text contains rate limit text
if (text.includes('stop the agent after 25 tool calls') ||
text.includes('Note: we default stop')) {
// Find the resume link position
const resumePos = text.indexOf('resume the conversation');
if (resumePos !== -1) {
vscode.window.showInformationMessage('Auto-resuming conversation...');
lastClickTime = now;
}
}
}
// Führe periodisch aus
const interval = global.setInterval(clickResumeLink, 1000);
// Speichere das Intervall in den Subscriptions
context.subscriptions.push({
dispose: () => global.clearInterval(interval)
});
// Führe die Funktion sofort aus
clickResumeLink();
});
context.subscriptions.push(disposable);
}
function deactivate() {
// Cleanup if needed
}
module.exports = {
activate,
deactivate
}

View File

@@ -16,7 +16,82 @@
- Vergessen der Mindmap-Datenstruktur gemäß der Roadmap
# Häufige Fehler und Lösungen
D
## Datenbankfehler
### Fehler: "no such column: user.password"
**Fehlerbeschreibung:**
```
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: user.password
[SQL: SELECT user.id AS user_id, user.username AS user_username, user.email AS user_email, user.password AS user_password, user.created_at AS user_created_at, user.is_active AS user_is_active, user.role AS user_role
FROM user
WHERE user.id = ?]
```
**Ursache:**
Die Spalte `password` fehlt in der Tabelle `user` der SQLite-Datenbank. Dies kann durch eine unvollständige Datenbankinitialisierung oder ein fehlerhaftes Schema-Update verursacht worden sein.
**Lösung:**
1. **Datenbank reparieren mit dem Fix-Skript**
```bash
python fix_user_table.py
```
Dieses Skript:
- Prüft, ob die Tabelle `user` existiert und erstellt sie, falls nicht
- Prüft, ob die Spalte `password` existiert und fügt sie hinzu, falls nicht
2. **Standardbenutzer erstellen**
```bash
python create_default_users.py
```
Dieses Skript:
- Erstellt Standardbenutzer (admin, user), falls keine vorhanden sind
- Setzt Passwörter mit korrektem Hashing
3. **Datenbank testen**
```bash
python test_app.py
```
Dieses Skript überprüft:
- Ob die Datenbank existiert
- Ob die Tabelle `user` korrekt konfiguriert ist
- Ob Benutzer vorhanden sind
## Häufige Ursachen für Datenbankfehler
1. **Inkonsistente Datenbankschemas**
- Unterschiede zwischen dem SQLAlchemy-Modell und der tatsächlichen Datenbankstruktur
- Fehlende Spalten, die in den Modellen definiert sind
2. **Falsche Datenbankinitialisierung**
- Die Datenbank wurde nicht korrekt initialisiert
- Fehler bei der Migration oder dem Schema-Update
3. **Datenbankdatei-Korrumpierung**
- Die SQLite-Datenbankdatei wurde beschädigt
- Lösung: Sicherung wiederherstellen oder Datenbank neu erstellen
## Vorbeugende Maßnahmen
1. **Regelmäßige Backups**
- Tägliche Sicherung der Datenbankdatei
2. **Schema-Validierung**
- Regelmäßige Überprüfung der Datenbankstruktur
- Automatisierte Tests für Datenbankschema
3. **Datenbankmigration**
- Verwenden Sie Flask-Migrate für strukturierte Datenbank-Updates
- Dokumentieren Sie alle Schemaänderungen
## Content Security Policy (CSP)
### Problem: Externe Ressourcen werden nicht geladen
@@ -79,15 +154,6 @@ D
3. Stellen Sie sicher, dass die Datei `static/css/tailwind.min.css` existiert und aktuell ist.
## Datenbank-Fehler
### Problem: Datenbank existiert nicht
**Fehler:** SQLite-Datenbank kann nicht geöffnet werden.
**Lösung:**
1. Datenbank initialisieren: `python TOOLS.py db:rebuild`
2. Sicherstellen, dass das Datenbankverzeichnis existiert und Schreibrechte hat
## Authentifizierung
### Problem: Login funktioniert nicht

Binary file not shown.

Binary file not shown.

4
app.py
View File

@@ -518,6 +518,10 @@ def datenschutz():
def agb():
return render_template('agb.html')
@app.route('/ueber-uns/')
def ueber_uns():
return render_template('ueber_uns.html')
# Benutzer-Mindmap-Funktionalität
@app.route('/my-mindmap/<int:mindmap_id>')
@login_required

34
check_schema.py Normal file
View File

@@ -0,0 +1,34 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3
# Verbindung zur Datenbank herstellen
conn = sqlite3.connect('systades.db')
cursor = conn.cursor()
# Liste aller Tabellen abrufen
print("Alle Tabellen in der Datenbank:")
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
for table in tables:
print(f"- {table[0]}")
# Schema der Datenbank abrufen
cursor.execute("SELECT sql FROM sqlite_master WHERE type='table';")
schemas = cursor.fetchall()
# Schematische Informationen ausgeben
print("\nDatenbankschema:")
for schema in schemas:
print("\n" + str(schema[0]))
# Schema der User-Tabelle genauer untersuchen, falls vorhanden
if ('user',) in tables:
print("\n\nBenutzer-Tabellenschema:")
cursor.execute("PRAGMA table_info(user);")
user_columns = cursor.fetchall()
for column in user_columns:
print(f"Column: {column[1]}, Type: {column[2]}, NOT NULL: {column[3]}, Default: {column[4]}, Primary Key: {column[5]}")
conn.close()

72
create_default_users.py Normal file
View File

@@ -0,0 +1,72 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3
import os
from werkzeug.security import generate_password_hash
from datetime import datetime
# Prüfen, ob die Datenbank existiert
db_path = 'systades.db'
if not os.path.exists(db_path):
print(f"Datenbank {db_path} existiert nicht.")
exit(1)
# Verbindung zur Datenbank herstellen
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Überprüfen, ob bereits Benutzer vorhanden sind
cursor.execute("SELECT COUNT(*) FROM user;")
user_count = cursor.fetchone()[0]
if user_count == 0:
print("Keine Benutzer in der Datenbank gefunden. Erstelle Standardbenutzer...")
# Standardbenutzer definieren
default_users = [
{
'username': 'admin',
'email': 'admin@example.com',
'password': generate_password_hash('admin'),
'created_at': datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
'is_active': 1,
'role': 'admin'
},
{
'username': 'user',
'email': 'user@example.com',
'password': generate_password_hash('user'),
'created_at': datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
'is_active': 1,
'role': 'user'
}
]
# Benutzer einfügen
for user in default_users:
cursor.execute("""
INSERT INTO user (username, email, password, created_at, is_active, role)
VALUES (?, ?, ?, ?, ?, ?);
""", (
user['username'],
user['email'],
user['password'],
user['created_at'],
user['is_active'],
user['role']
))
conn.commit()
print(f"{len(default_users)} Standardbenutzer wurden erstellt.")
else:
print(f"Es sind bereits {user_count} Benutzer in der Datenbank vorhanden.")
# Überprüfen der eingefügten Benutzer
print("\nBenutzer in der Datenbank:")
cursor.execute("SELECT id, username, email, role FROM user;")
users = cursor.fetchall()
for user in users:
print(f"ID: {user[0]}, Benutzername: {user[1]}, E-Mail: {user[2]}, Rolle: {user[3]}")
conn.close()
print("\nBenutzeraktualisierung abgeschlossen.")

Binary file not shown.

70
fix_user_table.py Normal file
View File

@@ -0,0 +1,70 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3
import os
# Prüfen, ob die Datenbank existiert
db_path = 'systades.db'
if not os.path.exists(db_path):
print(f"Datenbank {db_path} existiert nicht.")
exit(1)
# Verbindung zur Datenbank herstellen
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Prüfen, ob die User-Tabelle existiert
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='user';")
if not cursor.fetchone():
print("Die Tabelle 'user' existiert nicht. Erstelle neue Tabelle...")
cursor.execute('''
CREATE TABLE user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(80) NOT NULL UNIQUE,
email VARCHAR(120) NOT NULL UNIQUE,
password VARCHAR(512) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
is_active BOOLEAN DEFAULT 1,
role VARCHAR(20) DEFAULT 'user'
)
''')
conn.commit()
print("Die Tabelle 'user' wurde erfolgreich erstellt.")
else:
# Überprüfen, ob die Spalte 'password' existiert
cursor.execute("PRAGMA table_info(user);")
columns = cursor.fetchall()
column_names = [column[1] for column in columns]
if 'password' not in column_names:
print("Die Spalte 'password' fehlt in der Tabelle 'user'. Füge Spalte hinzu...")
cursor.execute("ALTER TABLE user ADD COLUMN password VARCHAR(512);")
conn.commit()
print("Die Spalte 'password' wurde erfolgreich hinzugefügt.")
else:
print("Die Spalte 'password' existiert bereits in der Tabelle 'user'.")
# Überprüfen der aktualisierten Spaltenstruktur
print("\nAktualisierte Tabellenspalten der 'user'-Tabelle:")
cursor.execute("PRAGMA table_info(user);")
updated_columns = cursor.fetchall()
for column in updated_columns:
print(f"Column: {column[1]}, Type: {column[2]}, NOT NULL: {column[3]}, Default: {column[4]}, Primary Key: {column[5]}")
# Datenbanktabellen anzeigen
print("\nAlle Tabellen in der Datenbank:")
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
for table in tables:
print(f"- {table[0]}")
# Schemaüberprüfung der user-Tabelle
print("\nSchema der 'user'-Tabelle:")
cursor.execute("SELECT sql FROM sqlite_master WHERE type='table' AND name='user';")
schema = cursor.fetchone()
if schema:
print(schema[0])
conn.close()
print("\nDatenbankaktualisierung abgeschlossen.")

View File

@@ -3,7 +3,7 @@
from app import app, initialize_database, db_path
from models import db, User, Thought, Comment, MindMapNode, ThoughtRelation, ThoughtRating, RelationType
from models import Category, UserMindmap, UserMindmapNode, MindmapNote, NodeRelationship
from models import Category, UserMindmap, UserMindmapNode, MindmapNote
import os
import sqlite3
from flask import Flask

View File

View File

@@ -12,3 +12,6 @@ gunicorn==21.2.0
pytest==7.4.0
pytest-flask==1.2.0
Flask-Migrate
flask-socketio==5.3.6
python-engineio==4.8.2
python-socketio==5.11.1

View File

@@ -67,15 +67,51 @@
});
/* 2. Hilfs-Funktionen für API-Zugriffe */
const get = endpoint => fetch(endpoint).then(r => r.json());
const post = (endpoint, body) =>
fetch(endpoint, {
const get = async endpoint => {
try {
const response = await fetch(endpoint);
if (!response.ok) {
console.error(`API-Fehler: ${endpoint} antwortet mit Status ${response.status}`);
return []; // Leeres Array zurückgeben bei Fehlern
}
return await response.json();
} catch (error) {
console.error(`Fehler beim Abrufen von ${endpoint}:`, error);
return []; // Leeres Array zurückgeben bei Netzwerkfehlern
}
};
const post = async (endpoint, body) => {
try {
const response = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body)
}).then(r => r.json());
const del = endpoint =>
fetch(endpoint, { method: 'DELETE' }).then(r => r.json());
});
if (!response.ok) {
console.error(`API-Fehler: ${endpoint} antwortet mit Status ${response.status}`);
return {}; // Leeres Objekt zurückgeben bei Fehlern
}
return await response.json();
} catch (error) {
console.error(`Fehler beim POST zu ${endpoint}:`, error);
return {}; // Leeres Objekt zurückgeben bei Netzwerkfehlern
}
};
const del = async endpoint => {
try {
const response = await fetch(endpoint, { method: 'DELETE' });
if (!response.ok) {
console.error(`API-Fehler: ${endpoint} antwortet mit Status ${response.status}`);
return {}; // Leeres Objekt zurückgeben bei Fehlern
}
return await response.json();
} catch (error) {
console.error(`Fehler beim DELETE zu ${endpoint}:`, error);
return {}; // Leeres Objekt zurückgeben bei Netzwerkfehlern
}
};
/* 3. Kategorien laden für Style-Informationen */
let categories = await get('/api/categories');
@@ -92,9 +128,12 @@
// Graph leeren (für Reload-Fälle)
cy.elements().remove();
// Überprüfen, ob nodes ein Array ist, wenn nicht, setze es auf ein leeres Array
const nodesArray = Array.isArray(nodes) ? nodes : [];
// Knoten zum Graph hinzufügen
cy.add(
nodes.map(node => {
nodesArray.map(node => {
// Kategorie-Informationen für Styling abrufen
const category = categories.find(c => c.id === node.category_id) || {};
@@ -112,9 +151,12 @@
})
);
// Überprüfen, ob relationships ein Array ist, wenn nicht, setze es auf ein leeres Array
const relationshipsArray = Array.isArray(relationships) ? relationships : [];
// Kanten zum Graph hinzufügen
cy.add(
relationships.map(rel => ({
relationshipsArray.map(rel => ({
data: {
id: `${rel.parent_id}_${rel.child_id}`,
source: rel.parent_id.toString(),
@@ -123,6 +165,54 @@
}))
);
// Wenn keine Knoten geladen wurden, Fallback-Knoten erstellen
if (nodesArray.length === 0) {
// Mindestens einen Standardknoten hinzufügen
cy.add({
data: {
id: 'fallback-1',
name: 'Mindmap',
description: 'Erstellen Sie hier Ihre eigene Mindmap',
color: '#3b82f6',
icon: 'help-circle'
},
position: { x: 300, y: 200 }
});
// Erfolgsmeldung anzeigen
console.log('Mindmap erfolgreich initialisiert mit Fallback-Knoten');
// Info-Meldung für Benutzer anzeigen
const infoBox = document.createElement('div');
infoBox.classList.add('info-message');
infoBox.style.position = 'absolute';
infoBox.style.top = '50%';
infoBox.style.left = '50%';
infoBox.style.transform = 'translate(-50%, -50%)';
infoBox.style.padding = '15px 20px';
infoBox.style.backgroundColor = 'rgba(59, 130, 246, 0.9)';
infoBox.style.color = 'white';
infoBox.style.borderRadius = '8px';
infoBox.style.zIndex = '5';
infoBox.style.maxWidth = '80%';
infoBox.style.textAlign = 'center';
infoBox.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)';
infoBox.innerHTML = 'Mindmap erfolgreich initialisiert.<br>Verwenden Sie die Werkzeugleiste, um Knoten hinzuzufügen.';
document.getElementById('cy').appendChild(infoBox);
// Meldung nach 5 Sekunden ausblenden
setTimeout(() => {
infoBox.style.opacity = '0';
infoBox.style.transition = 'opacity 0.5s ease';
setTimeout(() => {
if (infoBox.parentNode) {
infoBox.parentNode.removeChild(infoBox);
}
}, 500);
}, 5000);
}
// Layout anwenden wenn keine Positionsdaten vorhanden
const nodesWithoutPosition = cy.nodes().filter(node =>
!node.position() || (node.position().x === 0 && node.position().y === 0)

File diff suppressed because it is too large Load Diff

View File

@@ -506,6 +506,10 @@
:class="darkMode ? 'text-gray-300 hover:text-white' : 'text-gray-600 hover:text-gray-900'">
Impressum
</a>
<a href="{{ url_for('ueber_uns') }}" class="text-sm transition-all duration-200"
:class="darkMode ? 'text-gray-300 hover:text-white' : 'text-gray-600 hover:text-gray-900'">
Über uns
</a>
<a href="{{ url_for('datenschutz') }}" class="text-sm transition-all duration-200"
:class="darkMode ? 'text-gray-300 hover:text-white' : 'text-gray-600 hover:text-gray-900'">
Datenschutz

View File

@@ -8,56 +8,56 @@
<h1 class="text-3xl font-bold mb-6 gradient-text">Impressum</h1>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Angaben gemäß § 5 TMG</h2>
<p class="mb-4">MindMap GmbH<br>
Musterstraße 123<br>
12345 Musterstadt<br>
Deutschland</p>
<h2 class="text-xl font-bold mb-4">Angaben gemäß § 5 TMG und § 55 RStV</h2>
<p class="mb-4">
<strong>Vertreten durch:</strong><br>
Max Mustermann, Geschäftsführer
Diese Website wird privat betrieben von:<br>
Marwin Medczinski<br>
Fasanenstraße 30<br>
16761 Hennigsdorf<br>
Deutschland
</p>
</p>
<p class="mb-4">
<strong>Kontakt:</strong><br>
Telefon: +49 (0) 123 456789<br>
E-Mail: info@mindmap-example.com
</p>
<p class="mb-4">
<strong>Registereintrag:</strong><br>
Eintragung im Handelsregister.<br>
Registergericht: Amtsgericht Musterstadt<br>
Registernummer: HRB 12345
</p>
<p class="mb-4">
<strong>Umsatzsteuer-ID:</strong><br>
Umsatzsteuer-Identifikationsnummer gemäß §27 a Umsatzsteuergesetz:<br>
DE 123456789
Telefon: +49 (0) 173 8041824<br>
E-Mail: medczinski.marwin@gmx.de
</p>
</section>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Redaktionell verantwortlich</h2>
<p>
Max Mustermann<br>
Musterstraße 123<br>
12345 Musterstadt
<h2 class="text-xl font-bold mb-4">Inhaltlich Verantwortlicher gemäß § 55 Abs. 2 RStV</h2>
<p class="mb-4">
Marwin Medczinski<br>
Fasanenstraße 30<br>
16761 Hennigsdorf
</p>
</section>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Hinweis zur Streitbeilegung</h2>
<p class="mb-4">Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit: <a href="https://ec.europa.eu/consumers/odr/" target="_blank" class="text-purple-600 hover:text-purple-800">https://ec.europa.eu/consumers/odr/</a></p>
<p class="mb-4">Ich bin nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.</p>
</section>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Haftungsausschluss</h2>
<h3 class="text-lg font-bold mb-2">Haftung für Inhalte</h3>
<p class="mb-4">Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.</p>
<p class="mb-4">Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.</p>
<p class="mb-4">Die Inhalte dieser Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte kann ich jedoch keine Gewähr übernehmen. Als Diensteanbieter bin ich gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.</p>
<p class="mb-4">Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen.</p>
<h3 class="text-lg font-bold mb-2">Haftung für Links</h3>
<p class="mb-4">Unser Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar.</p>
<p>Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.</p>
<p class="mb-4">Diese Website enthält Links zu externen Webseiten Dritter, auf deren Inhalte ich keinen Einfluss habe. Deshalb kann ich für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar.</p>
<p class="mb-4">Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Links umgehend entfernen.</p>
</section>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Urheberrecht</h2>
<p class="mb-4">Die durch mich erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen meiner schriftlichen Zustimmung. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.</p>
<p>Soweit die Inhalte auf dieser Seite nicht von mir erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitte ich um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werde ich derartige Inhalte umgehend entfernen.</p>
</section>
</div>
</div>

79
templates/ueber_uns.html Normal file
View File

@@ -0,0 +1,79 @@
{% extends "base.html" %}
{% block title %}Über uns{% endblock %}
{% block content %}
<div class="max-w-3xl mx-auto">
<div class="card p-6 md:p-8">
<h1 class="text-3xl font-bold mb-6 gradient-text">Über uns</h1>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Unsere Vision</h2>
<p class="mb-4">
Systades ist ein innovatives Projekt, das darauf abzielt, das Teilen und Vernetzen von Wissen und Gedanken zu revolutionieren. Unsere Plattform ermöglicht es Nutzern, ihre Ideen in interaktiven Mindmaps zu organisieren und mit anderen zu teilen, wodurch ein kollaboratives Netzwerk des Wissens entsteht.
</p>
<p class="mb-4">
Wir glauben daran, dass Wissen am wertvollsten ist, wenn es geteilt und vernetzt wird. Durch die Verbindung verschiedener Perspektiven und Denkansätze entstehen neue Erkenntnisse und Innovationen.
</p>
</section>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Das Team</h2>
<p class="mb-4">
Till Tomczak und Marwin Medczinski arbeiten gemeinsam daran, Systades kontinuierlich zu verbessern und weiterzuentwickeln.
</p>
<!-- Platz für Team-Mitglieder -->
<div class="team-members space-y-6">
<!-- Beispiel für ein Team-Mitglied (kann als Vorlage verwendet werden) -->
<!--
<div class="team-member p-4 border border-gray-200 dark:border-gray-700 rounded-lg">
<h3 class="text-lg font-bold mb-2">[Name]</h3>
<p class="text-gray-600 dark:text-gray-300 mb-2">[Position/Rolle]</p>
<p class="text-sm">[Kurze Beschreibung oder Verantwortlichkeiten]</p>
</div>
-->
</div>
</section>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Unsere Mission</h2>
<p class="mb-4">
Wir setzen uns dafür ein, eine Plattform zu schaffen, die:
</p>
<ul class="list-disc list-inside space-y-2 mb-4">
<li>Intuitive Werkzeuge für die Organisation und Visualisierung von Wissen bereitstellt</li>
<li>Die Zusammenarbeit und den Austausch zwischen Nutzern fördert</li>
<li>Kreativität und innovative Denkansätze unterstützt</li>
<li>Einen sicheren und respektvollen Raum für intellektuellen Austausch bietet</li>
</ul>
</section>
<section class="mb-8">
<h2 class="text-xl font-bold mb-4">Technologie & Innovation</h2>
<p class="mb-4">
Systades nutzt modernste Technologien und innovative Ansätze, um eine optimale Nutzererfahrung zu gewährleisten. Unsere Plattform wird kontinuierlich weiterentwickelt, um neue Funktionen und Verbesserungen zu integrieren.
</p>
<p>
Wir legen besonderen Wert auf:
</p>
<ul class="list-disc list-inside space-y-2 mt-2">
<li>Intuitive Benutzeroberfläche</li>
<li>Hohe Performance und Zuverlässigkeit</li>
<li>Datensicherheit und Privatsphäre</li>
<li>Barrierefreiheit und Inklusivität</li>
</ul>
</section>
<section>
<h2 class="text-xl font-bold mb-4">Kontakt & Feedback</h2>
<p class="mb-4">
Wir freuen uns über Ihr Feedback und Ihre Ideen zur Verbesserung von Systades. Gemeinsam können wir die Plattform weiter optimieren und an die Bedürfnisse unserer Nutzer anpassen.
</p>
<p>
Kontaktieren Sie uns gerne für Fragen, Anregungen oder Kooperationsmöglichkeiten.
</p>
</section>
</div>
</div>
{% endblock %}

60
test_app.py Normal file
View File

@@ -0,0 +1,60 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3
import os
import requests
import time
print("Systades Anwendungstest")
print("=======================")
# Prüfen, ob die Datenbank existiert
db_path = 'systades.db'
if not os.path.exists(db_path):
print(f"Datenbank {db_path} existiert nicht.")
exit(1)
# Datenbankprüfung
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Prüfen, ob die User-Tabelle existiert und Benutzer enthält
cursor.execute("SELECT COUNT(*) FROM user;")
user_count = cursor.fetchone()[0]
print(f"Anzahl der Benutzer in der Datenbank: {user_count}")
if user_count == 0:
print("WARNUNG: Keine Benutzer in der Datenbank gefunden!")
print("Bitte führen Sie das Skript 'create_default_users.py' aus, um Standardbenutzer zu erstellen.")
conn.close()
exit(1)
# Tabellenschema prüfen
cursor.execute("PRAGMA table_info(user);")
columns = cursor.fetchall()
column_names = [column[1] for column in columns]
print(f"Spalten in der User-Tabelle: {', '.join(column_names)}")
# Überprüfen, ob die password-Spalte existiert
if 'password' not in column_names:
print("FEHLER: Die Spalte 'password' fehlt in der Tabelle 'user'!")
print("Bitte führen Sie das Skript 'fix_user_table.py' aus, um die Datenbank zu reparieren.")
conn.close()
exit(1)
# Benutzer für Testlogin abrufen
cursor.execute("SELECT username, email FROM user LIMIT 1;")
test_user = cursor.fetchone()
if test_user:
print(f"Testbenutzer für Login: {test_user[0]} (E-Mail: {test_user[1]})")
else:
print("FEHLER: Konnte keinen Testbenutzer abrufen.")
conn.close()
print("\nDie Datenbank scheint korrekt konfiguriert zu sein.")
print("Sie können nun die Anwendung starten und sich mit den folgenden Zugangsdaten anmelden:")
print(" Admin: username=admin, password=admin")
print(" User: username=user, password=user")
print("\nTest abgeschlossen.")