diff --git a/Html/app.py b/Html/app.py index 88e4c11..604f177 100644 --- a/Html/app.py +++ b/Html/app.py @@ -5,7 +5,6 @@ bootstrap_paths() from apps import create_app from apps.extensions import socketio -# 工厂创建 app,工厂里已经做了:加载配置/注册蓝图/注册 namespaces app = create_app() if __name__ == "__main__": diff --git a/Html/apps/config.py b/Html/apps/config.py index df4ad86..a06fb17 100644 --- a/Html/apps/config.py +++ b/Html/apps/config.py @@ -13,6 +13,7 @@ class Config: SQLALCHEMY_TRACK_MODIFICATIONS = False SECRET_KEY = os.getenv("SECRET_KEY", "cakebaker") # 覆盖优先 VSCODE_WEB_URL = GLOBAL_CONFIG['VSCODE_WEB']['url'] + CODE_LIKE_URL = GLOBAL_CONFIG['CODE_LIKE']['url'] USER_DATA_DIR = GLOBAL_CONFIG['USER_DATA']['dir'] COURSE_DATA_DIR = GLOBAL_CONFIG['COURSE_DATA']['dir'] diff --git a/Html/apps/extension_ase/ase_client/manager.py b/Html/apps/extension_ase/ase_client/manager.py index 466bfd6..fafa536 100644 --- a/Html/apps/extension_ase/ase_client/manager.py +++ b/Html/apps/extension_ase/ase_client/manager.py @@ -158,7 +158,13 @@ class ChatManager: path_dir, "--extensions-dir", "/share/extension/" ] - + try:# 创建.config,.local文件夹 + subprocess.run(["sudo", "mkdir", "-p", f"/home/{user_id}/.config"], check=True) + subprocess.run(["sudo", "mkdir", "-p", f"/home/{user_id}/.local"], check=True) + subprocess.run(["sudo", "chown", "-R", f"{user_id}:shared_group_{user_id}", f"/home/{user_id}/.config", f"/home/{user_id}/.local"], check=True) + except Exception as e: + print("mkdir .config .local error"+str(e)) + pop = subprocess.Popen( cmd, stdout=subprocess.DEVNULL, diff --git a/Html/apps/static/js/chatbox.js b/Html/apps/static/js/chatbox.js index d3052b2..2563921 100644 --- a/Html/apps/static/js/chatbox.js +++ b/Html/apps/static/js/chatbox.js @@ -4,7 +4,7 @@ let system_message_idx=0 document.addEventListener('DOMContentLoaded', function() { data = window.appData; console.log(data); - socket = io('wss://hsamooc.cn/agent',{ + socket = io('wss://hsamooc.com/agent',{ query:{ user_uuid:data.user_uuid, folder:data.folder @@ -13,6 +13,7 @@ document.addEventListener('DOMContentLoaded', function() { socket.on('connect', function() { console.log('Connected to server'); socket.emit('login',JSON.stringify(data)); + OpenIframe(); }); // 监听来自服务器的消息 socket.on('message', function(data) { diff --git a/Html/apps/static/基础算法-二分.html b/Html/apps/static/基础算法-二分.html index f1ff381..55114b3 100644 --- a/Html/apps/static/基础算法-二分.html +++ b/Html/apps/static/基础算法-二分.html @@ -10,11 +10,8 @@ -

二分

-
-

Auto-generated at 2025-09-05 19:48

-
-

阶段一:示例阶段

+

二分查找与二分答案

+

二分查找

引入

二分是一个很简单基础,但很重要的知识点,为以后许多高级的数据结构与算法铺垫。

下面是一个用二分的简单场景:

@@ -47,7 +44,7 @@

第三行一个整数q,表示询问的次数。(1<=q<=10^4)

后q行,每行一个整数b,表示询问的数。(0<=b<=10^8)

输出
-

q行,每行一个整数,对应每次询问的返回结果。

+

q行,每行一个整数,对应每次询问的返回结果

提示:

完成代码后,通知Agent进行评测。

如果你还不完全会这个算法,询问Agent获取提示并进行学习。

diff --git a/Html/apps/templates/code-like-desktop.html b/Html/apps/templates/code-like-desktop.html new file mode 100644 index 0000000..528a7d0 --- /dev/null +++ b/Html/apps/templates/code-like-desktop.html @@ -0,0 +1,234 @@ + + + + + + Code Development Platform + + + + + + + + + + + +
+ + +
+ + +
+
+ + +
+ + +
+ + + + + + +
+
+
+ + + + + + diff --git a/Html/apps/views/vscode.py b/Html/apps/views/vscode.py index 99df8ea..c0b2a25 100644 --- a/Html/apps/views/vscode.py +++ b/Html/apps/views/vscode.py @@ -5,10 +5,12 @@ from flask import Blueprint, current_app, session, redirect, url_for, render_tem from ..services.backboard_service import realtime_response from ..extension_ase.ase_client.manager import ChatManager import subprocess +from ..auth.decorators import require_role bp = Blueprint("vscode", __name__) @bp.route("/desktop////") +@require_role def desktop(user_uuid, course_id, chapter_name, lesson_name): username2uuid = current_app.extensions["username2uuid"] uuid2username = current_app.extensions["uuid2username"] @@ -117,13 +119,18 @@ def desktop(user_uuid, course_id, chapter_name, lesson_name): ) # 确保文件的所有权归 user_id subprocess.run( - ["sudo", "chown", f"{user_id}:{user_id}", config_path], + ["sudo", "chown", f"{user_id}:shared_group_{user_id}", config_path], + check=True + ) + subprocess.run( + ["sudo", "chmod", "-R", "770", config_path], check=True ) return render_template( - "desktop.html", - vscode_web_url=current_app.config["VSCODE_WEB_URL"]+f"/vsc{user_id}", - user_uuid=session["user_uuid"], course_id=course_id, chapter_name=chapter_name, lesson_name=lesson_name, + "code-like-desktop.html", + # vscode_web_url=current_app.config["VSCODE_WEB_URL"]+f"/vsc{user_id}", + vscode_web_url=current_app.config["CODE_LIKE_URL"], + user_uuid=session["user_uuid"], course_id=course_id, chapter_name=chapter_name, lesson_name=lesson_name,user_id=user_id, workspace_path=path_for_vscode, ) diff --git a/Html/config.ini b/Html/config.ini index 98605a4..4ec4054 100644 --- a/Html/config.ini +++ b/Html/config.ini @@ -5,7 +5,9 @@ api_key = sk-aMpnWklN2IbsK44d1kNpy6YOP9bk1pdPJjFeEmbb0a5ytEFf model=gpt-4.1-nano [VSCODE_WEB] -url = https://hsamooc.cn +url = https://hsamooc.com +[CODE_LIKE] +url = https://hsamooc.com/vsc-like #http://asengine.net:8282 [VSCODE_WEB_PATH] is_wsl = true @@ -16,7 +18,7 @@ dir = db/data/user/ [COURSE_DATA] dir = db/data/course/ [MONGO] -uri = mongodb://admin:12138cake@hsamooc.com:27017/hsamooc_test?authSource=admin +uri = mongodb://admin:12138cake@8.152.163.193:27017/hsamooc_test?authSource=admin [TENCENT_COS] secret_id = AKIDZ0EG4f2FE0YszsXzEF5h5GDwSlOtDLGx diff --git a/code-server-like/app/views/routes.py b/code-server-like/app/views/routes.py index e9a5372..6b44eb3 100644 --- a/code-server-like/app/views/routes.py +++ b/code-server-like/app/views/routes.py @@ -73,6 +73,6 @@ def vsc_like(user_uuid, user_id, course_id, chapter_name, lesson_name, port): - return render_template('index.html', course_id=course_id, chapter_name=chapter_name, lesson_name=lesson_name) + return render_template('index.html', course_id=course_id, chapter_name=chapter_name, lesson_name=lesson_name, code_like_config=config) diff --git a/code-server-like/static/js/code-like-extension.js b/code-server-like/static/js/code-like-extension.js new file mode 100644 index 0000000..9d705af --- /dev/null +++ b/code-server-like/static/js/code-like-extension.js @@ -0,0 +1,57 @@ +let vs_socket = null; +function sendToServer(data){ + try { + if (!vs_socket) { + return; + } + vs_socket.emit('message', data) + } catch (error) { + console.error('Error sending data to Flask server:', error); + } +} +function ChangeActiveTextEditor(path){ //打开文件 + console.log(`Current open file: ${path}`); + sendToServer({ + type: 'activeFile', + filePath: path, + config: code_like_config, + }); +} +function ChangeWorkspacefileTree(fileTree) { + if (fileTree){ + sendToServer({ + type: 'workspaceFolders', + fileTree: fileTree, + config: code_like_config, + }); + } +} + + +// vscode.window.showInformationMessage('Connecting to server...'); + +vs_socket = io('wss://hsamooc.com/vscode'); +vs_socket.on('connect', () => { + // vscode.window.showInformationMessage('Connected to server'); + console.log('Connected to server'); + vs_socket.emit('login', { config: code_like_config }); +}); +vs_socket.on('disconnect', () => { + // vscode.window.showInformationMessage('Disconnected from server'); + console.log('Disconnected from server'); +}); +vs_socket.on('terminal',(data)=>{ + // vscode.window.showInformationMessage('Terminal command received'+data); + term.write(data.data); +}) + + +// 缓冲器函数(防抖) +function debounceSendToServer(data, delay) { + if (debounceTimeout) { + clearTimeout(debounceTimeout); + } + debounceTimeout = setTimeout(() => { + sendToServer(data); + }, delay); +} diff --git a/code-server-like/static/js/file.js b/code-server-like/static/js/file.js index aeeabe0..16387bf 100644 --- a/code-server-like/static/js/file.js +++ b/code-server-like/static/js/file.js @@ -33,6 +33,8 @@ function loadFileTree() { } bindRightClickMenu(fileTree); }); + // code-like 工作区变动 + ChangeWorkspacefileTree(fileTree); } let selectedItem = null; // 用来保存当前选中的文件/文件夹 let copiedItem = null; // 用于存储复制的文件或文件夹 @@ -80,9 +82,8 @@ function bindRightClickMenu(treeData) { } }); } - +// 检查是否为空或仅包含空格 function checkValidName(name) { - // 检查是否为空或仅包含空格 if (!name.trim()) { return false; } @@ -256,7 +257,13 @@ function loadFileContent(item) { editor.setValue(data.content); } }); + // code-like 打开文件 + ChangeActiveTextEditor(item.path+'/'+item.name); } + + + + // 新建文件 function createNewFile(event) { event.stopPropagation(); @@ -271,8 +278,12 @@ function createNewFile(event) { fetch(`/vsc-like/create-file`, { method: 'POST', body: JSON.stringify({ path: fileName, parent: selectedItem.path }) , headers: { 'Content-Type': 'application/json' } }) .then(() => loadFileTree()); } + }else{ + fetch(`/vsc-like/create-file`, { method: 'POST', body: JSON.stringify({ path: fileName, parent: '.' }) , headers: { 'Content-Type': 'application/json' } }) + .then(() => loadFileTree()); } } + } // 新建文件夹 diff --git a/code-server-like/static/js/terminal.js b/code-server-like/static/js/terminal.js index 6a91190..139685a 100644 --- a/code-server-like/static/js/terminal.js +++ b/code-server-like/static/js/terminal.js @@ -1,10 +1,11 @@ + let term = null; document.addEventListener('DOMContentLoaded', () => { Terminal.applyAddon(fullscreen) Terminal.applyAddon(fit) Terminal.applyAddon(webLinks) Terminal.applyAddon(search) - const term = new Terminal({ + term = new Terminal({ col:80, row:20, cursorBlink: 5, @@ -22,7 +23,7 @@ }); }); - const socket = io('https://hsamooc.cn/vsc-like',{path:'/vsc-like-ws'}); + const socket = io('https://hsamooc.com/vsc-like',{path:'/vsc-like-ws'}); const status = document.getElementById("status") socket.on("pty_output", function(data){ diff --git a/code-server-like/templates/index.html b/code-server-like/templates/index.html index d0c250e..35ad750 100644 --- a/code-server-like/templates/index.html +++ b/code-server-like/templates/index.html @@ -60,6 +60,7 @@ +