# myapp/views/vscode.py import os, uuid, json from flask import Blueprint, current_app, session, redirect, url_for, render_template, request, jsonify from ..services.backboard_service import realtime_response bp = Blueprint("vscode", __name__) @bp.route("/desktop///") def desktop(user_id, course_id, chapter_id): # session 中放 uuid(访客也能进则给一个) if "user_id" not in session: session["user_id"] = "user_" + str(uuid.uuid4()) current_app.logger.debug("user %s uuid is %s", user_id, session["user_id"]) # 全局映射 username2uuid = current_app.extensions["username2uuid"] uuid2username = current_app.extensions["uuid2username"] userid_recorder = current_app.extensions["userid_recorder"] username2uuid[user_id] = session["user_id"] uuid2username[session["user_id"]] = user_id userid_recorder[f"{user_id}&{course_id}"] = session["user_id"] # 按课程/章节创建工作目录 base_root = current_app.config["STUDENT_WORKSPACE_ROOT"] path_dir = os.path.join(base_root, user_id, course_id, chapter_id) os.makedirs(path_dir, exist_ok=True) # 写 .config(并按需要转换为 WSL 路径) cfg = current_app.config["VSCODE_WEB_PATH"] path_for_vscode = path_dir if cfg.get("is_wsl"): path_for_vscode = path_for_vscode.replace("\\", "/") \ .replace(cfg.get("windows_path", ""), cfg.get("wsl_path", "")) config_path = os.path.join(path_dir, ".config") tmpd = { "user_id": user_id, "course_id": course_id, "chapter_id": chapter_id, "path": path_for_vscode } with open(config_path, "w", encoding="utf-8") as f: json.dump(tmpd, f, ensure_ascii=False) current_app.logger.debug("config file path: %s", config_path) return render_template( "desktop.html", vscode_web_url=current_app.config["VSCODE_WEB_URL"], user_id=user_id, course_id=course_id, chapter_id=chapter_id, workspace_path=path_for_vscode ) @bp.route("/desktop_nouser//") def desktop_nouser(course_id, chapter_id): if "user_id" not in session: return redirect(url_for("auth.login")) # 如果你有 auth 蓝图 user_uuid = session["user_id"] username = current_app.extensions["uuid2username"].get(user_uuid) return redirect(url_for("vscode.desktop", user_id=username, course_id=course_id, chapter_id=chapter_id)) @bp.route("/vscode_data", methods=["POST"]) def vscode_data(): data = request.get_json(force=True) config = data.get("config") or {} realtime_response(config, data) # 调用服务层逻辑 return jsonify({"status": "success", "received": data})