From af7d7fc716c9a1181dff03688794a72889d0dc44 Mon Sep 17 00:00:00 2001 From: p
Date: Wed, 12 Aug 2026 18:37:51 +0800 Subject: [PATCH] tree: lazy-load children only --- wwwroot/api/workspace_tree.dspy | 66 +++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/wwwroot/api/workspace_tree.dspy b/wwwroot/api/workspace_tree.dspy index bac0893..7499ff5 100644 --- a/wwwroot/api/workspace_tree.dspy +++ b/wwwroot/api/workspace_tree.dspy @@ -1,7 +1,9 @@ -# workspace_tree.dspy - 返回完整目录树(非懒加载,所有节点一次性返回) +# workspace_tree.dspy - 懒加载:返回指定节点的直接子目录 import os +node_id = (params_kw or {}).get('id', '').strip() + uid = await get_user() if not uid: uid = 'user-01' @@ -27,29 +29,47 @@ async with DBPools().sqlorContext(dbname) as sor: ws_dir = ws if ws.startswith('/') else workspace_base + '/' + org_id + '/' + pname if not ws_dir or not os.path.isdir(ws_dir): - return [{"id": "__root__", "parentid": "", "label": "📁 工作空间(不可用)", "path": ""}] + if not node_id: + return [{"id": "__root__", "parentid": "", "label": "📁 工作空间(不可用)", "path": ws_dir, "is_leaf": False}] + return [] -items = [{"id": "__root__", "parentid": "", "label": "📁 " + os.path.basename(ws_dir), "path": ws_dir, "is_leaf": False}] +# 初始加载:无 id,返回根节点 +if not node_id: + return [{ + "id": "__root__", + "parentid": "", + "label": "📁 " + os.path.basename(ws_dir), + "path": ws_dir, + "is_leaf": False + }] -def scan_dir(path, parent_id, rel_prefix): - try: - entries = sorted(os.listdir(path)) - except Exception: - return - for name in entries: - full = os.path.join(path, name) - if name.startswith('.') or name == '__pycache__': - continue - if os.path.isdir(full): - rel_path = rel_prefix + '/' + name if rel_prefix else name - items.append({ - "id": rel_path, - "parentid": parent_id, - "label": "📁 " + name, - "path": full, - "is_leaf": False - }) - scan_dir(full, rel_path, rel_path) +# 展开节点:id=__root__ → 扫描 ws_dir。否则拼完整路径 +if node_id == '__root__': + scan_path = ws_dir +else: + scan_path = ws_dir + '/' + node_id + +if not os.path.isdir(scan_path): + return [] + +items = [] +try: + entries = sorted(os.listdir(scan_path)) +except Exception: + return [] + +for name in entries: + full = os.path.join(scan_path, name) + if name.startswith('.') or name == '__pycache__': + continue + if os.path.isdir(full): + rel_path = node_id + '/' + name if node_id != '__root__' else name + items.append({ + "id": rel_path, + "parentid": node_id, + "label": "📁 " + name, + "path": full, + "is_leaf": False + }) -scan_dir(ws_dir, "__root__", "") return items