Refactor database initialization: streamline the process by removing the old init_database function, implementing a new structure for database setup, and ensuring the creation of a comprehensive mindmap hierarchy with an admin user. Update app.py to run on port 5000 instead of 6000.

This commit is contained in:
2025-04-21 18:43:58 +01:00
parent b6bf9f387d
commit 9f8eba6736
12 changed files with 210 additions and 107 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -277,4 +277,4 @@ node_thought_association = db.Table('node_thought_association',
if __name__ == '__main__': if __name__ == '__main__':
app = create_app() app = create_app()
app.run(host="0.0.0.0", port=6000, debug=True) app.run(host="0.0.0.0", port=5000, debug=True)
+128 -72
View File
@@ -1,88 +1,144 @@
from app import app, db, User, MindMapNode import os
import sys
from pathlib import Path
import shutil
# Pfade zu möglichen Datenbankdateien
db_paths = [
Path("instance/mindmap.db"),
Path("mindmap.db"),
Path("website/instance/mindmap.db"),
Path("website/mindmap.db")
]
# Lösche bestehende Datenbankdateien
for db_path in db_paths:
if db_path.exists():
try:
print(f"Lösche Datenbank: {db_path}")
os.remove(db_path)
except Exception as e:
print(f"Fehler beim Löschen von {db_path}: {e}")
# Stelle sicher, dass das instance-Verzeichnis existiert
instance_dir = Path("instance")
if not instance_dir.exists():
os.makedirs(instance_dir)
# Importiere Datenbankmodelle und erstelle die Datenbank
from app import db, create_app, User, MindMapNode, Thought, Comment
app = create_app()
def init_database():
"""Initialize the database with admin user and mindmap structure."""
with app.app_context(): with app.app_context():
# Create all tables print("Erstelle neue Datenbank...")
db.create_all() db.drop_all() # Stelle sicher, dass alle Tabellen gelöscht sind
db.create_all() # Erstelle Tabellen basierend auf den Modellen
# Check if we already have users # Erstelle einen Admin-Benutzer
if User.query.first() is None: admin = User(username="admin", email="admin@example.com", is_admin=True)
print("Creating admin user...") admin.set_password("admin123")
# Create admin user
admin = User(username='admin', email='admin@example.com', is_admin=True)
admin.set_password('admin123')
db.session.add(admin) db.session.add(admin)
# Create regular test user # Erstelle Root-Node
test_user = User(username='test', email='test@example.com', is_admin=False) root = MindMapNode(name="Wissenschaft")
test_user.set_password('test123')
db.session.add(test_user)
db.session.commit()
print("Admin user created successfully!")
# Check if we already have mindmap nodes
if MindMapNode.query.first() is None:
print("Creating initial mindmap structure...")
# Create initial mindmap structure
root = MindMapNode(name="Wissenschaftliche Mindmap")
db.session.add(root) db.session.add(root)
# Level 1 nodes # Hauptkategorien erstellen
node1 = MindMapNode(name="Naturwissenschaften", parent=root) naturwissenschaften = MindMapNode(name="Naturwissenschaften", parent=root)
node2 = MindMapNode(name="Geisteswissenschaften", parent=root) geisteswissenschaften = MindMapNode(name="Geisteswissenschaften", parent=root)
node3 = MindMapNode(name="Technologie", parent=root) sozialwissenschaften = MindMapNode(name="Sozialwissenschaften", parent=root)
node4 = MindMapNode(name="Künste", parent=root) ingenieurwissenschaften = MindMapNode(name="Ingenieurwissenschaften", parent=root)
db.session.add_all([node1, node2, node3, node4]) medizin = MindMapNode(name="Medizin", parent=root)
informatik = MindMapNode(name="Informatik", parent=root)
# Level 2 nodes - Naturwissenschaften db.session.add_all([naturwissenschaften, geisteswissenschaften, sozialwissenschaften,
node1_1 = MindMapNode(name="Physik", parent=node1) ingenieurwissenschaften, medizin, informatik])
node1_2 = MindMapNode(name="Biologie", parent=node1)
node1_3 = MindMapNode(name="Chemie", parent=node1)
node1_4 = MindMapNode(name="Astronomie", parent=node1)
db.session.add_all([node1_1, node1_2, node1_3, node1_4])
# Level 2 nodes - Geisteswissenschaften # Unterkategorien für Naturwissenschaften
node2_1 = MindMapNode(name="Philosophie", parent=node2) physik = MindMapNode(name="Physik", parent=naturwissenschaften)
node2_2 = MindMapNode(name="Geschichte", parent=node2) chemie = MindMapNode(name="Chemie", parent=naturwissenschaften)
node2_3 = MindMapNode(name="Psychologie", parent=node2) biologie = MindMapNode(name="Biologie", parent=naturwissenschaften)
node2_4 = MindMapNode(name="Soziologie", parent=node2) astronomie = MindMapNode(name="Astronomie", parent=naturwissenschaften)
db.session.add_all([node2_1, node2_2, node2_3, node2_4]) geologie = MindMapNode(name="Geologie", parent=naturwissenschaften)
# Level 2 nodes - Technologie # Unterkategorien für Physik
node3_1 = MindMapNode(name="Informatik", parent=node3) quantenphysik = MindMapNode(name="Quantenphysik", parent=physik)
node3_2 = MindMapNode(name="Biotechnologie", parent=node3) relativitätstheorie = MindMapNode(name="Relativitätstheorie", parent=physik)
node3_3 = MindMapNode(name="Künstliche Intelligenz", parent=node3) thermodynamik = MindMapNode(name="Thermodynamik", parent=physik)
node3_4 = MindMapNode(name="Energietechnik", parent=node3)
db.session.add_all([node3_1, node3_2, node3_3, node3_4])
# Level 2 nodes - Künste # Unterkategorien für Geisteswissenschaften
node4_1 = MindMapNode(name="Bildende Kunst", parent=node4) philosophie = MindMapNode(name="Philosophie", parent=geisteswissenschaften)
node4_2 = MindMapNode(name="Musik", parent=node4) geschichte = MindMapNode(name="Geschichte", parent=geisteswissenschaften)
node4_3 = MindMapNode(name="Literatur", parent=node4) linguistik = MindMapNode(name="Linguistik", parent=geisteswissenschaften)
node4_4 = MindMapNode(name="Film", parent=node4) literaturwissenschaft = MindMapNode(name="Literaturwissenschaft", parent=geisteswissenschaften)
db.session.add_all([node4_1, node4_2, node4_3, node4_4]) religionswissenschaft = MindMapNode(name="Religionswissenschaft", parent=geisteswissenschaften)
# Level 3 nodes - a few examples # Unterkategorien für Sozialwissenschaften
# Physik soziologie = MindMapNode(name="Soziologie", parent=sozialwissenschaften)
MindMapNode(name="Quantenphysik", parent=node1_1) psychologie = MindMapNode(name="Psychologie", parent=sozialwissenschaften)
MindMapNode(name="Relativitätstheorie", parent=node1_1) politikwissenschaft = MindMapNode(name="Politikwissenschaft", parent=sozialwissenschaften)
wirtschaftswissenschaften = MindMapNode(name="Wirtschaftswissenschaften", parent=sozialwissenschaften)
# Informatik # Unterkategorien für Ingenieurwissenschaften
MindMapNode(name="Maschinelles Lernen", parent=node3_1) maschinenbau = MindMapNode(name="Maschinenbau", parent=ingenieurwissenschaften)
MindMapNode(name="Softwareentwicklung", parent=node3_1) elektrotechnik = MindMapNode(name="Elektrotechnik", parent=ingenieurwissenschaften)
MindMapNode(name="Datenbanken", parent=node3_1) bauingenieurwesen = MindMapNode(name="Bauingenieurwesen", parent=ingenieurwissenschaften)
verfahrenstechnik = MindMapNode(name="Verfahrenstechnik", parent=ingenieurwissenschaften)
# Unterkategorien für Medizin
humanmedizin = MindMapNode(name="Humanmedizin", parent=medizin)
zahnmedizin = MindMapNode(name="Zahnmedizin", parent=medizin)
pharmazie = MindMapNode(name="Pharmazie", parent=medizin)
neurologie = MindMapNode(name="Neurologie", parent=medizin)
onkologie = MindMapNode(name="Onkologie", parent=medizin)
# Unterkategorien für Informatik
künstliche_intelligenz = MindMapNode(name="Künstliche Intelligenz", parent=informatik)
datenbanken = MindMapNode(name="Datenbanken", parent=informatik)
softwareentwicklung = MindMapNode(name="Softwareentwicklung", parent=informatik)
computergrafik = MindMapNode(name="Computergrafik", parent=informatik)
cybersicherheit = MindMapNode(name="Cybersicherheit", parent=informatik)
# Alle Nodes zur Session hinzufügen
all_nodes = [physik, chemie, biologie, astronomie, geologie,
quantenphysik, relativitätstheorie, thermodynamik,
philosophie, geschichte, linguistik, literaturwissenschaft, religionswissenschaft,
soziologie, psychologie, politikwissenschaft, wirtschaftswissenschaften,
maschinenbau, elektrotechnik, bauingenieurwesen, verfahrenstechnik,
humanmedizin, zahnmedizin, pharmazie, neurologie, onkologie,
künstliche_intelligenz, datenbanken, softwareentwicklung, computergrafik, cybersicherheit]
db.session.add_all(all_nodes)
# Füge einen Beispiel-Gedanken hinzu
thought = Thought(
content="Dies ist ein Beispiel-Gedanke zur Wissenschaft allgemein.",
branch="Wissenschaft",
user_id=1 # Admin-Benutzer
)
db.session.add(thought)
root.thoughts.append(thought)
# Füge weitere Beispiel-Gedanken hinzu
thought_ai = Thought(
content="Künstliche Intelligenz transformiert viele Bereiche der Wissenschaft und Gesellschaft.",
branch="Künstliche Intelligenz",
user_id=1
)
db.session.add(thought_ai)
künstliche_intelligenz.thoughts.append(thought_ai)
thought_physik = Thought(
content="Die Quantenphysik stellt unser Verständnis der Realität grundlegend in Frage.",
branch="Quantenphysik",
user_id=1
)
db.session.add(thought_physik)
quantenphysik.thoughts.append(thought_physik)
# Commit changes
db.session.commit() db.session.commit()
print("Mindmap structure created successfully!")
print("Database initialization complete.") print("Datenbank wurde erfolgreich initialisiert!")
print(f"Admin-Benutzer erstellt: admin/admin123")
if __name__ == "__main__": print(f"Root-Node 'Wissenschaft' erstellt mit mehreren Hauptkategorien und Unterkategorien")
init_database()
print("You can now run the application with 'python app.py'")
print("Login with:")
print(" Admin: username=admin, password=admin123")
print(" User: username=test, password=test123")
Binary file not shown.
+5 -6
View File
@@ -1,11 +1,10 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os import os
from init_db import init_database import sys
from app import app from app import create_app
app = create_app()
if __name__ == "__main__": if __name__ == "__main__":
# Initialize the database first # Run the app directly - no need to call init_database as it doesn't exist
init_database()
# Run the Flask application
app.run(host="0.0.0.0", debug=True) app.run(host="0.0.0.0", debug=True)
+1 -4
View File
@@ -8,7 +8,7 @@
<div class="flex flex-col space-y-4 sm:flex-row sm:space-y-0 sm:space-x-4 justify-center"> <div class="flex flex-col space-y-4 sm:flex-row sm:space-y-0 sm:space-x-4 justify-center">
<a href="{{ url_for('mindmap') }}" class="bg-gradient-to-r from-indigo-500 to-purple-600 hover:from-indigo-600 hover:to-purple-700 text-white font-semibold px-6 py-3 rounded-lg transition-all duration-300 transform hover:scale-105"> <a href="{{ url_for('mindmap') }}" class="bg-gradient-to-r from-indigo-500 to-purple-600 hover:from-indigo-600 hover:to-purple-700 text-white font-semibold px-6 py-3 rounded-lg transition-all duration-300 transform hover:scale-105">
Starte die Mindmap Zum Netzwerk
</a> </a>
{% if not current_user.is_authenticated %} {% if not current_user.is_authenticated %}
<a href="{{ url_for('register') }}" class="glass hover:bg-white/20 text-white font-semibold px-6 py-3 rounded-lg transition-all duration-300 transform hover:scale-105"> <a href="{{ url_for('register') }}" class="glass hover:bg-white/20 text-white font-semibold px-6 py-3 rounded-lg transition-all duration-300 transform hover:scale-105">
@@ -20,19 +20,16 @@
<div class="mt-12 grid grid-cols-1 md:grid-cols-3 gap-6 w-full max-w-4xl"> <div class="mt-12 grid grid-cols-1 md:grid-cols-3 gap-6 w-full max-w-4xl">
<div class="glass p-6 text-white"> <div class="glass p-6 text-white">
<div class="text-3xl mb-2">🧠</div>
<h3 class="text-xl font-semibold mb-2">Visualisiere Wissen</h3> <h3 class="text-xl font-semibold mb-2">Visualisiere Wissen</h3>
<p class="text-white/80">Erkenne Zusammenhänge zwischen verschiedenen Wissensgebieten durch intuitive Mindmaps.</p> <p class="text-white/80">Erkenne Zusammenhänge zwischen verschiedenen Wissensgebieten durch intuitive Mindmaps.</p>
</div> </div>
<div class="glass p-6 text-white"> <div class="glass p-6 text-white">
<div class="text-3xl mb-2">💡</div>
<h3 class="text-xl font-semibold mb-2">Teile Gedanken</h3> <h3 class="text-xl font-semibold mb-2">Teile Gedanken</h3>
<p class="text-white/80">Füge deine eigenen Gedanken zu bestehenden Themen hinzu und bereichere die Community.</p> <p class="text-white/80">Füge deine eigenen Gedanken zu bestehenden Themen hinzu und bereichere die Community.</p>
</div> </div>
<div class="glass p-6 text-white"> <div class="glass p-6 text-white">
<div class="text-3xl mb-2">🔄</div>
<h3 class="text-xl font-semibold mb-2">Interaktive Vernetzung</h3> <h3 class="text-xl font-semibold mb-2">Interaktive Vernetzung</h3>
<p class="text-white/80">Beteilige dich an Diskussionen und sieh wie sich Ideen gemeinsam entwickeln.</p> <p class="text-white/80">Beteilige dich an Diskussionen und sieh wie sich Ideen gemeinsam entwickeln.</p>
</div> </div>
+26 -10
View File
@@ -99,6 +99,13 @@
.node:hover circle { .node:hover circle {
filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.8)); filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.8));
} }
/* Fix for "keine Auswahl" text */
#selected-node-title {
width: 100%;
overflow: visible;
word-wrap: break-word;
}
</style> </style>
{% endblock %} {% endblock %}
@@ -346,12 +353,21 @@
// Create hierarchical layout // Create hierarchical layout
const root = d3.hierarchy(data); const root = d3.hierarchy(data);
// Create tree layout // Create radial layout instead of tree for all-direction branches
const treeLayout = d3.tree() const radius = Math.min(width, height) / 2 - 100;
.size([height - 100, width - 200])
.nodeSize([80, 200]);
treeLayout(root); const radialLayout = d3.cluster()
.size([360, radius]);
radialLayout(root);
// Convert to Cartesian coordinates
root.descendants().forEach(d => {
// Convert from polar to Cartesian coordinates
const angle = (d.x - 90) / 180 * Math.PI;
d.x = d.y * Math.cos(angle);
d.y = d.y * Math.sin(angle);
});
// Create links // Create links
const links = g.selectAll('.link') const links = g.selectAll('.link')
@@ -360,10 +376,10 @@
.append('path') .append('path')
.attr('class', 'link') .attr('class', 'link')
.attr('d', d => { .attr('d', d => {
return `M${d.source.y},${d.source.x} return `M${d.source.x},${d.source.y}
C${(d.source.y + d.target.y) / 2},${d.source.x} C${(d.source.x + d.target.x) / 2},${(d.source.y + d.target.y) / 2}
${(d.source.y + d.target.y) / 2},${d.target.x} ${(d.source.x + d.target.x) / 2},${(d.source.y + d.target.y) / 2}
${d.target.y},${d.target.x}`; ${d.target.x},${d.target.y}`;
}); });
// Create nodes // Create nodes
@@ -375,7 +391,7 @@
const categoryClass = getNodeCategory(d.data.name, rootCategories); const categoryClass = getNodeCategory(d.data.name, rootCategories);
return `node ${categoryClass} ${d.data.id === selectedNode ? 'node--selected' : ''}`; return `node ${categoryClass} ${d.data.id === selectedNode ? 'node--selected' : ''}`;
}) })
.attr('transform', d => `translate(${d.y},${d.x})`) .attr('transform', d => `translate(${d.x},${d.y})`)
.on('click', (event, d) => selectNode(d.data.id, d.data.name)) .on('click', (event, d) => selectNode(d.data.id, d.data.name))
.on('mouseover', function(event, d) { .on('mouseover', function(event, d) {
tooltip.transition() tooltip.transition()
+35
View File
@@ -0,0 +1,35 @@
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return """
<!DOCTYPE html>
<html>
<head>
<title>Test Seite</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; line-height: 1.6; }
.container { max-width: 800px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px; }
h1 { color: #333; }
</style>
</head>
<body>
<div class="container">
<h1>Test Seite funktioniert!</h1>
<p>Wenn Sie diese Seite sehen können, funktioniert der grundlegende Flask-Server korrekt.</p>
<p>Server-Status:</p>
<ul>
<li>Flask läuft auf Port 5000</li>
<li>Keine Datenbankverbindung erforderlich</li>
<li>Keine Templates erforderlich</li>
</ul>
<p>Versuchen Sie, diese URL in verschiedenen Browsern zu öffnen.</p>
</div>
</body>
</html>
"""
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)