diff --git a/wwwroot/api/workspace_delete.dspy b/wwwroot/api/workspace_delete.dspy index a3a9d09..813fa2e 100644 --- a/wwwroot/api/workspace_delete.dspy +++ b/wwwroot/api/workspace_delete.dspy @@ -28,6 +28,13 @@ async with DBPools().sqlorContext(dbname) as sor: # 产线隔离:跨产线项目视为无项目(与弹窗入口一致,防绕过) project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id) space_dir, _ = await get_space_dir(sor, uid, session_id) + # 通用会话(pipeline_id=_generic):锁用户专属目录 _general/{uid}, + # 不进入任何项目的工作空间(2026-09-08 用户要求) + if pipeline_id == '_generic': + _gd = generic_workspace_dir(uid) + os.makedirs(_gd, exist_ok=True) + project_dir = _gd + space_dir = _gd if not file_id or file_id == '__root__': return {"status": "error", "message": "不能删除根目录"} diff --git a/wwwroot/api/workspace_file.dspy b/wwwroot/api/workspace_file.dspy index e5d1876..bbda057 100644 --- a/wwwroot/api/workspace_file.dspy +++ b/wwwroot/api/workspace_file.dspy @@ -31,6 +31,13 @@ async with DBPools().sqlorContext(dbname) as sor: # 产线隔离:跨产线项目视为无项目(与弹窗入口一致,防绕过) project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id) space_dir, _ = await get_space_dir(sor, uid, session_id) + # 通用会话(pipeline_id=_generic):锁用户专属目录 _general/{uid}, + # 不进入任何项目的工作空间(2026-09-08 用户要求) + if pipeline_id == '_generic': + _gd = generic_workspace_dir(uid) + os.makedirs(_gd, exist_ok=True) + project_dir = _gd + space_dir = _gd if not file_id or file_id == '__root__': return {"widgettype": "Message", "options": {"title": "错误", "message": "未指定文件"}} diff --git a/wwwroot/api/workspace_files.dspy b/wwwroot/api/workspace_files.dspy index d3cc5da..29bb847 100644 --- a/wwwroot/api/workspace_files.dspy +++ b/wwwroot/api/workspace_files.dspy @@ -29,6 +29,13 @@ async with DBPools().sqlorContext(dbname) as sor: # 产线隔离:跨产线项目视为无项目(与弹窗入口一致,防绕过) project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id) space_dir, _ = await get_space_dir(sor, uid, session_id) + # 通用会话(pipeline_id=_generic):锁用户专属目录 _general/{uid}, + # 不进入任何项目的工作空间(2026-09-08 用户要求) + if pipeline_id == '_generic': + _gd = generic_workspace_dir(uid) + os.makedirs(_gd, exist_ok=True) + project_dir = _gd + space_dir = _gd full_dir = resolve_workspace_path(project_dir, space_dir, folder_id) diff --git a/wwwroot/api/workspace_open.dspy b/wwwroot/api/workspace_open.dspy index 210321d..3ace8b7 100644 --- a/wwwroot/api/workspace_open.dspy +++ b/wwwroot/api/workspace_open.dspy @@ -29,6 +29,13 @@ async with DBPools().sqlorContext(dbname) as sor: # 产线隔离:跨产线项目视为无项目(与弹窗入口一致,防绕过) project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id) space_dir, _ = await get_space_dir(sor, uid, session_id) + # 通用会话(pipeline_id=_generic):锁用户专属目录 _general/{uid}, + # 不进入任何项目的工作空间(2026-09-08 用户要求) + if pipeline_id == '_generic': + _gd = generic_workspace_dir(uid) + os.makedirs(_gd, exist_ok=True) + project_dir = _gd + space_dir = _gd if not file_id: return {"widgettype": "Message", "options": {"title": "打开失败", "message": "未指定文件"}} diff --git a/wwwroot/api/workspace_popup.dspy b/wwwroot/api/workspace_popup.dspy index 4578a32..39220fc 100644 --- a/wwwroot/api/workspace_popup.dspy +++ b/wwwroot/api/workspace_popup.dspy @@ -25,6 +25,13 @@ async with DBPools().sqlorContext(dbname) as sor: # 产线隔离:传了 pipeline_id 时,会话项目跨产线则视为无项目 # (商机/投标产线入口不显示开发产线项目的空间) project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id) + # 通用会话(pipeline_id=_generic):锁用户专属目录 _general/{uid}, + # 不进入任何项目的工作空间(2026-09-08 用户要求) + if pipeline_id == '_generic': + _gd = generic_workspace_dir(uid) + os.makedirs(_gd, exist_ok=True) + project_dir = _gd + space_dir = _gd pname = os.path.basename(project_dir) if project_dir else '' diff --git a/wwwroot/api/workspace_tree.dspy b/wwwroot/api/workspace_tree.dspy index bbf9d8a..8d3b58a 100644 --- a/wwwroot/api/workspace_tree.dspy +++ b/wwwroot/api/workspace_tree.dspy @@ -26,6 +26,13 @@ async with DBPools().sqlorContext(dbname) as sor: # 产线隔离:跨产线项目视为无项目(与弹窗入口一致,防绕过) project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id) space_dir, _ = await get_space_dir(sor, uid, session_id) + # 通用会话(pipeline_id=_generic):锁用户专属目录 _general/{uid}, + # 不进入任何项目的工作空间(2026-09-08 用户要求) + if pipeline_id == '_generic': + _gd = generic_workspace_dir(uid) + os.makedirs(_gd, exist_ok=True) + project_dir = _gd + space_dir = _gd # 提前读出项目用到的 apps/modules(sor 在块内有效,块外调用会因 sor 关闭返回空) _apps, _modules = await get_project_apps_modules(sor, uid, session_id) diff --git a/wwwroot/api/workspace_upload.dspy b/wwwroot/api/workspace_upload.dspy index bfdd05b..129bd0c 100644 --- a/wwwroot/api/workspace_upload.dspy +++ b/wwwroot/api/workspace_upload.dspy @@ -31,6 +31,13 @@ async with DBPools().sqlorContext(dbname) as sor: # 产线隔离:跨产线项目视为无项目(与弹窗入口一致,防绕过) project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id) space_dir, _ = await get_space_dir(sor, uid, session_id) + # 通用会话(pipeline_id=_generic):锁用户专属目录 _general/{uid}, + # 不进入任何项目的工作空间(2026-09-08 用户要求) + if pipeline_id == '_generic': + _gd = generic_workspace_dir(uid) + os.makedirs(_gd, exist_ok=True) + project_dir = _gd + space_dir = _gd if not project_dir or not os.path.isdir(project_dir): return {"status": "error", "message": "项目目录不可用"} diff --git a/wwwroot/api/workspace_view.dspy b/wwwroot/api/workspace_view.dspy index ba83519..1700957 100644 --- a/wwwroot/api/workspace_view.dspy +++ b/wwwroot/api/workspace_view.dspy @@ -31,6 +31,13 @@ async with DBPools().sqlorContext(dbname) as sor: # 产线隔离:跨产线项目视为无项目(与弹窗入口一致,防绕过) project_dir, _ = await get_project_dir_pl(sor, uid, session_id, pipeline_id) space_dir, _ = await get_space_dir(sor, uid, session_id) + # 通用会话(pipeline_id=_generic):锁用户专属目录 _general/{uid}, + # 不进入任何项目的工作空间(2026-09-08 用户要求) + if pipeline_id == '_generic': + _gd = generic_workspace_dir(uid) + os.makedirs(_gd, exist_ok=True) + project_dir = _gd + space_dir = _gd if not file_id or file_id == '__root__': return {"widgettype": "Message", "options": {"title": "查看失败", "message": "未指定文件"}}