diff --git a/app/__init__.py b/app/__init__.py
index 5fd7acc..ddb86b3 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -20,6 +20,7 @@ def create_app():
login_manager.login_view = "login.login"
from .models.user import User
+ from .models.gamestate import GameState
with app.app_context():
db.create_all()
diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc
index 7124496..3a6324c 100644
Binary files a/app/__pycache__/__init__.cpython-311.pyc and b/app/__pycache__/__init__.cpython-311.pyc differ
diff --git a/app/app.db b/app/app.db
index 479ce3a..d8d2fca 100644
Binary files a/app/app.db and b/app/app.db differ
diff --git a/app/models/__pycache__/gamestate.cpython-311.pyc b/app/models/__pycache__/gamestate.cpython-311.pyc
new file mode 100644
index 0000000..02fc1f9
Binary files /dev/null and b/app/models/__pycache__/gamestate.cpython-311.pyc differ
diff --git a/app/models/gamestate.py b/app/models/gamestate.py
new file mode 100644
index 0000000..d68aa08
--- /dev/null
+++ b/app/models/gamestate.py
@@ -0,0 +1,11 @@
+from .. import db
+from flask_login import UserMixin
+
+class GameState(UserMixin, db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ user_id = db.Column(db.Integer, nullable=False)
+
+ board = db.Column(db.Text, nullable=False) # JSON String
+ mode = db.Column(db.String(10), nullable=False) # queens / rooks
+
+ created_at = db.Column(db.DateTime, default=db.func.now())
diff --git a/app/routes/__pycache__/login_routes.cpython-311.pyc b/app/routes/__pycache__/login_routes.cpython-311.pyc
index 1b6cba1..60142fb 100644
Binary files a/app/routes/__pycache__/login_routes.cpython-311.pyc and b/app/routes/__pycache__/login_routes.cpython-311.pyc differ
diff --git a/app/routes/__pycache__/main_routes.cpython-311.pyc b/app/routes/__pycache__/main_routes.cpython-311.pyc
index e097a85..c3c7267 100644
Binary files a/app/routes/__pycache__/main_routes.cpython-311.pyc and b/app/routes/__pycache__/main_routes.cpython-311.pyc differ
diff --git a/app/routes/login_routes.py b/app/routes/login_routes.py
index a849065..4525a07 100644
--- a/app/routes/login_routes.py
+++ b/app/routes/login_routes.py
@@ -46,7 +46,7 @@ def login():
return render_template("login.html")
-@login_bp.route('/logout')
+@login_bp.route('/logout', methods=['POST'])
@login_required
def logout():
logout_user()
diff --git a/app/routes/main_routes.py b/app/routes/main_routes.py
index 102dcaa..5222b6f 100644
--- a/app/routes/main_routes.py
+++ b/app/routes/main_routes.py
@@ -1,6 +1,9 @@
from flask import Blueprint, jsonify, render_template, request
from flask_login import login_required, current_user
-import random
+import random, json
+from ..models.gamestate import GameState
+from ..models.user import User
+from .. import db
main_bp = Blueprint("main", __name__)
@@ -73,3 +76,33 @@ def solve_rooks(n=8):
random.shuffle(solution)
return solution
+@main_bp.route("/save", methods=["POST"])
+def save_game():
+ data = request.json
+
+ board = data["board"]
+ mode = data["mode"]
+
+ game = GameState(
+ user_id=current_user.id,
+ board=json.dumps(board),
+ mode=mode
+ )
+
+ db.session.add(game)
+ db.session.commit()
+
+ return jsonify({"status": "saved"})
+
+@main_bp.route("/load")
+def load_game():
+ game = GameState.query.filter_by(user_id=current_user.id)\
+ .order_by(GameState.id.desc()).first()
+
+ if not game:
+ return jsonify({"board": [-1]*8, "mode": "queens"})
+
+ return jsonify({
+ "board": json.loads(game.board),
+ "mode": game.mode
+ })
diff --git a/app/static/js/dashboard.js b/app/static/js/dashboard.js
index d51e68c..c8c744a 100644
--- a/app/static/js/dashboard.js
+++ b/app/static/js/dashboard.js
@@ -196,4 +196,39 @@ function updateQueenList() {
count++;
}
}
-}
\ No newline at end of file
+}
+
+async function saveGame() {
+ await fetch("/save", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify({
+ board: board,
+ mode: mode
+ })
+ });
+
+ alert("💾 Spiel gespeichert!");
+}
+
+async function loadGame() {
+ const res = await fetch("/load");
+ const data = await res.json();
+
+ board = data.board;
+ mode = data.mode;
+
+ // Buttons richtig setzen
+ document.getElementById("btnQueens").classList.remove("active");
+ document.getElementById("btnRooks").classList.remove("active");
+
+ if (mode === "queens") {
+ document.getElementById("btnQueens").classList.add("active");
+ } else {
+ document.getElementById("btnRooks").classList.add("active");
+ }
+
+ drawBoard();
+}
diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html
index 9db3807..dcf526a 100644
--- a/app/templates/dashboard.html
+++ b/app/templates/dashboard.html
@@ -62,6 +62,9 @@
+
+
+
diff --git a/database_setup.sql b/database_setup.sql
index e1be1a2..c2ece83 100644
--- a/database_setup.sql
+++ b/database_setup.sql
@@ -5,3 +5,11 @@ CREATE TABLE users (
email VARCHAR(120) NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
+
+CREATE TABLE game_state (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ user_id INTEGER NOT NULL,
+ board TEXT NOT NULL, -- JSON String (z.B. "[0,4,7,5,2,6,1,3]")
+ mode TEXT NOT NULL, -- "queens" oder "rooks"
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+);
\ No newline at end of file