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