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 @@
+