diff --git a/json/build.sh b/json/build.sh new file mode 100755 index 0000000..2ca4f9d --- /dev/null +++ b/json/build.sh @@ -0,0 +1,2 @@ +#!/usr/bin/bash +xls2ui -m ../models -o ../wwwroot scense_demo *.json diff --git a/models/demo_hot_script.json b/models/demo_hot_script.json index 59f511a..15cf55c 100644 --- a/models/demo_hot_script.json +++ b/models/demo_hot_script.json @@ -1,19 +1,71 @@ { "summary": [ - {"pkey": "id", "caption": "演示热加载脚本", "tablename": "demo_hot_script", "module": "demo"} + { + "name": "demo_hot_script", + "title": "demo_hot_script", + "primary": [ + "id" + ] + } ], "fields": [ - {"name": "id", "type": "str(64)", "comment": "主键"}, - {"name": "session_id", "type": "str(64)", "comment": "演示会话ID"}, - {"name": "script_id", "type": "str(64)", "comment": "脚本ID(script_engine 联动)"}, - {"name": "script_name", "type": "str(128)", "comment": "脚本名称"}, - {"name": "script_type", "type": "str(16)", "comment": "脚本类型 python/expr"}, - {"name": "script_content", "type": "text", "comment": "脚本内容"}, - {"name": "updated_at", "type": "datetime", "comment": "保存时间"} + { + "name": "id", + "title": "主键", + "type": "str", + "length": 255, + "nullable": "no" + }, + { + "name": "session_id", + "title": "演示会话ID", + "type": "str", + "length": 255 + }, + { + "name": "script_id", + "title": "脚本ID(script_engine 联动)", + "type": "str", + "length": 255 + }, + { + "name": "script_name", + "title": "脚本名称", + "type": "str", + "length": 255 + }, + { + "name": "script_type", + "title": "脚本类型 python/expr", + "type": "str", + "length": 255 + }, + { + "name": "script_content", + "title": "脚本内容", + "type": "text" + }, + { + "name": "updated_at", + "title": "保存时间", + "type": "datetime" + } ], "indexes": [ - {"name": "idx_hot_session", "fields": ["session_id"]}, - {"name": "idx_hot_script", "fields": ["script_id"]} + { + "name": "idx_hot_session", + "idxtype": "index", + "idxfields": [ + "session_id" + ] + }, + { + "name": "idx_hot_script", + "idxtype": "index", + "idxfields": [ + "script_id" + ] + } ], "codes": [] -} +} \ No newline at end of file diff --git a/models/demo_presence.json b/models/demo_presence.json index ad50cd9..5d8e4d6 100644 --- a/models/demo_presence.json +++ b/models/demo_presence.json @@ -1,18 +1,65 @@ { "summary": [ - {"pkey": "id", "caption": "演示多人预览在线表", "tablename": "demo_presence", "module": "demo"} + { + "name": "demo_presence", + "title": "demo_presence", + "primary": [ + "id" + ] + } ], "fields": [ - {"name": "id", "type": "str(64)", "comment": "主键"}, - {"name": "session_id", "type": "str(64)", "comment": "演示会话ID"}, - {"name": "user_id", "type": "str(64)", "comment": "在线用户ID"}, - {"name": "user_name", "type": "str(64)", "comment": "在线用户名称"}, - {"name": "joined_at", "type": "datetime", "comment": "加入时间"}, - {"name": "last_seen_at", "type": "datetime", "comment": "最后活跃时间"} + { + "name": "id", + "title": "主键", + "type": "str", + "length": 255, + "nullable": "no" + }, + { + "name": "session_id", + "title": "演示会话ID", + "type": "str", + "length": 255 + }, + { + "name": "user_id", + "title": "在线用户ID", + "type": "str", + "length": 255 + }, + { + "name": "user_name", + "title": "在线用户名称", + "type": "str", + "length": 255 + }, + { + "name": "joined_at", + "title": "加入时间", + "type": "datetime" + }, + { + "name": "last_seen_at", + "title": "最后活跃时间", + "type": "datetime" + } ], "indexes": [ - {"name": "idx_presence_session", "fields": ["session_id"]}, - {"name": "idx_presence_user", "fields": ["user_id"]} + { + "name": "idx_presence_session", + "idxtype": "index", + "idxfields": [ + "session_id" + ] + }, + { + "name": "idx_presence_user", + "idxtype": "index", + "idxfields": [ + "user_id" + ] + } ], "codes": [] -} +} \ No newline at end of file diff --git a/models/demo_session.json b/models/demo_session.json index 450a58b..0aba6e8 100644 --- a/models/demo_session.json +++ b/models/demo_session.json @@ -1,22 +1,87 @@ { "summary": [ - {"pkey": "id", "caption": "演示会话表", "tablename": "demo_session", "module": "demo"} + { + "name": "demo_session", + "title": "demo_session", + "primary": [ + "id" + ] + } ], "fields": [ - {"name": "id", "type": "str(64)", "comment": "会话ID"}, - {"name": "world_id", "type": "str(64)", "comment": "世界ID(W-01 world.id)"}, - {"name": "session_name", "type": "str(128)", "comment": "演示名称"}, - {"name": "status", "type": "str(16)", "comment": "preview=演示中 paused=已暂停 ended=已结束"}, - {"name": "camera_mode", "type": "str(16)", "comment": "视角模式 orbit/topdown/firstperson"}, - {"name": "owner_id", "type": "str(32)", "comment": "演示发起人"}, - {"name": "viewer_count", "type": "int", "comment": "在线观看人数"}, - {"name": "extra_json", "type": "text", "comment": "扩展JSON(全屏等)"}, - {"name": "created_at", "type": "datetime", "comment": "创建时间"}, - {"name": "updated_at", "type": "datetime", "comment": "更新时间"} + { + "name": "id", + "title": "会话ID", + "type": "str", + "length": 255, + "nullable": "no" + }, + { + "name": "world_id", + "title": "世界ID(W-01 world.id)", + "type": "str", + "length": 255 + }, + { + "name": "session_name", + "title": "演示名称", + "type": "str", + "length": 255 + }, + { + "name": "status", + "title": "preview=演示中 paused=已暂停 ended=已结束", + "type": "str", + "length": 255 + }, + { + "name": "camera_mode", + "title": "视角模式 orbit/topdown/firstperson", + "type": "str", + "length": 255 + }, + { + "name": "owner_id", + "title": "演示发起人", + "type": "str", + "length": 255 + }, + { + "name": "viewer_count", + "title": "在线观看人数", + "type": "int" + }, + { + "name": "extra_json", + "title": "扩展JSON(全屏等)", + "type": "text" + }, + { + "name": "created_at", + "title": "创建时间", + "type": "datetime" + }, + { + "name": "updated_at", + "title": "更新时间", + "type": "datetime" + } ], "indexes": [ - {"name": "idx_demo_session_world", "fields": ["world_id"]}, - {"name": "idx_demo_session_status", "fields": ["status"]} + { + "name": "idx_demo_session_world", + "idxtype": "index", + "idxfields": [ + "world_id" + ] + }, + { + "name": "idx_demo_session_status", + "idxtype": "index", + "idxfields": [ + "status" + ] + } ], "codes": [] -} +} \ No newline at end of file diff --git a/models/demo_session_state.json b/models/demo_session_state.json index ec1bdba..89d4e67 100644 --- a/models/demo_session_state.json +++ b/models/demo_session_state.json @@ -1,19 +1,70 @@ { "summary": [ - {"pkey": "id", "caption": "演示实体状态覆盖层", "tablename": "demo_session_state", "module": "demo"} + { + "name": "demo_session_state", + "title": "demo_session_state", + "primary": [ + "id" + ] + } ], "fields": [ - {"name": "id", "type": "str(64)", "comment": "主键"}, - {"name": "session_id", "type": "str(64)", "comment": "演示会话ID"}, - {"name": "entity_id", "type": "str(64)", "comment": "实体ID"}, - {"name": "entity_name", "type": "str(128)", "comment": "实体名称"}, - {"name": "base_json", "type": "text", "comment": "演示开始时的基线状态(快照,只读)"}, - {"name": "demo_json", "type": "text", "comment": "演示中的当前状态(可实时修改)"}, - {"name": "updated_at", "type": "datetime", "comment": "更新时间"} + { + "name": "id", + "title": "主键", + "type": "str", + "length": 255, + "nullable": "no" + }, + { + "name": "session_id", + "title": "演示会话ID", + "type": "str", + "length": 255 + }, + { + "name": "entity_id", + "title": "实体ID", + "type": "str", + "length": 255 + }, + { + "name": "entity_name", + "title": "实体名称", + "type": "str", + "length": 255 + }, + { + "name": "base_json", + "title": "演示开始时的基线状态(快照,只读)", + "type": "text" + }, + { + "name": "demo_json", + "title": "演示中的当前状态(可实时修改)", + "type": "text" + }, + { + "name": "updated_at", + "title": "更新时间", + "type": "datetime" + } ], "indexes": [ - {"name": "idx_state_session", "fields": ["session_id"]}, - {"name": "idx_state_entity", "fields": ["entity_id"]} + { + "name": "idx_state_session", + "idxtype": "index", + "idxfields": [ + "session_id" + ] + }, + { + "name": "idx_state_entity", + "idxtype": "index", + "idxfields": [ + "entity_id" + ] + } ], "codes": [] -} +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 3bcc148..f44d5ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["setuptools>=45", "wheel"] build-backend = "setuptools.build_meta" [project] -name = "demo" +name = "scense_demo" version = "1.0.0" description = "W-07 实时演示模块 —— demo 会话 + three.js 预览 + 状态隔离" requires-python = ">=3.8" @@ -11,4 +11,4 @@ dependencies = ["sqlor", "bricks_for_python"] [tool.setuptools.packages.find] where = ["."] -include = ["demo*"] +include = ["scense_demo*"] diff --git a/demo/__init__.py b/scense_demo/__init__.py similarity index 100% rename from demo/__init__.py rename to scense_demo/__init__.py diff --git a/demo/demo.py b/scense_demo/demo.py similarity index 100% rename from demo/demo.py rename to scense_demo/demo.py diff --git a/demo/init.py b/scense_demo/init.py similarity index 100% rename from demo/init.py rename to scense_demo/init.py diff --git a/scripts/load_path.py b/scripts/load_path.py index 7312e33..a673d39 100644 --- a/scripts/load_path.py +++ b/scripts/load_path.py @@ -27,33 +27,33 @@ from set_role_perm import set_role_perm # noqa: E402 PATHS_LOGINED = [ # 模块入口 - '/demo', - '/demo/index.ui', + '/scense_demo', + '/scense_demo/index.ui', # 演示控制台(前端页面 + js/css) - '/demo/demo_viewer.ui', - '/demo/demo_viewer.js', - '/demo/demo_viewer.css', + '/scense_demo/demo_viewer.ui', + '/scense_demo/demo_viewer.js', + '/scense_demo/demo_viewer.css', # CRUD 会话列表(xls2ui 生成的 5 件套) - '/demo/demo_session', - '/demo/demo_session/index.ui', - '/demo/demo_session/get_demo_session.dspy', - '/demo/demo_session/add_demo_session.dspy', - '/demo/demo_session/update_demo_session.dspy', - '/demo/demo_session/delete_demo_session.dspy', + '/scense_demo/demo_session', + '/scense_demo/demo_session/index.ui', + '/scense_demo/demo_session/get_demo_session.dspy', + '/scense_demo/demo_session/add_demo_session.dspy', + '/scense_demo/demo_session/update_demo_session.dspy', + '/scense_demo/demo_session/delete_demo_session.dspy', # 业务 API - '/demo/api/start.dspy', - '/demo/api/stop.dspy', - '/demo/api/camera.dspy', - '/demo/api/pause.dspy', - '/demo/api/entity_edit.dspy', - '/demo/api/entity_attrs.dspy', - '/demo/api/hotload.dspy', - '/demo/api/presence.dspy', - '/demo/api/fullscreen.dspy', - '/demo/api/state.dspy', - '/demo/api/session_create.dspy', - '/demo/api/session_update.dspy', - '/demo/api/session_delete.dspy', + '/scense_demo/api/start.dspy', + '/scense_demo/api/stop.dspy', + '/scense_demo/api/camera.dspy', + '/scense_demo/api/pause.dspy', + '/scense_demo/api/entity_edit.dspy', + '/scense_demo/api/entity_attrs.dspy', + '/scense_demo/api/hotload.dspy', + '/scense_demo/api/presence.dspy', + '/scense_demo/api/fullscreen.dspy', + '/scense_demo/api/state.dspy', + '/scense_demo/api/session_create.dspy', + '/scense_demo/api/session_update.dspy', + '/scense_demo/api/session_delete.dspy', ] diff --git a/wwwroot/api/session_update.dspy b/wwwroot/api/session_update.dspy index 6ebde94..3fbd74d 100644 --- a/wwwroot/api/session_update.dspy +++ b/wwwroot/api/session_update.dspy @@ -7,7 +7,7 @@ try: return {"status": 400, "message": "id 不能为空"} if not params_kw.get('session_name') and not params_kw.get('camera_mode'): return {"status": 400, "message": "无可更新字段(仅 session_name/camera_mode)"} - async with get_sor_context(request._run_ns, "demo") as sor: + async with get_sor_context(request._run_ns, "scense") as sor: recs = await sor.R('demo_session', {'id': sid}) if not recs: return {"status": 404, "message": "演示会话不存在: %s" % sid} diff --git a/wwwroot/demo_viewer.js b/wwwroot/demo_viewer.js index 4ef0dbf..627c5b1 100644 --- a/wwwroot/demo_viewer.js +++ b/wwwroot/demo_viewer.js @@ -1,21 +1,21 @@ /** * demo_viewer.js —— W-07 实时演示前端控制 - * 职责:three.js 渲染世界 + 500ms 轮询状态(<1s 实时反映) + 调用 /demo/api/*.dspy + * 职责:three.js 渲染世界 + 500ms 轮询状态(<1s 实时反映) + 调用 /scense_demo/api/*.dspy * 状态隔离:所有修改走覆盖层接口,结束演示后正式数据不变(服务端保证)。 */ (function () { 'use strict'; var API = { - start: '/demo/api/start.dspy', - stop: '/demo/api/stop.dspy', - camera: '/demo/api/camera.dspy', - pause: '/demo/api/pause.dspy', - edit: '/demo/api/entity_edit.dspy', - attrs: '/demo/api/entity_attrs.dspy', - hotload: '/demo/api/hotload.dspy', - presence: '/demo/api/presence.dspy', - fullscreen: '/demo/api/fullscreen.dspy', - state: '/demo/api/state.dspy' + start: '/scense_demo/api/start.dspy', + stop: '/scense_demo/api/stop.dspy', + camera: '/scense_demo/api/camera.dspy', + pause: '/scense_demo/api/pause.dspy', + edit: '/scense_demo/api/entity_edit.dspy', + attrs: '/scense_demo/api/entity_attrs.dspy', + hotload: '/scense_demo/api/hotload.dspy', + presence: '/scense_demo/api/presence.dspy', + fullscreen: '/scense_demo/api/fullscreen.dspy', + state: '/scense_demo/api/state.dspy' }; var state = { diff --git a/wwwroot/index.ui b/wwwroot/index.ui index 13942d1..4338366 100644 --- a/wwwroot/index.ui +++ b/wwwroot/index.ui @@ -13,7 +13,7 @@ ]}, {"widgettype": "VBox", "options": {"backgroundColor": "#FFFFFF", "padding": "20px", "cursor": "pointer"}, "binds": [{"wid": "self", "event": "click", "actiontype": "urlwidget", "target": "app.demo_content", - "options": {"url": "{{entire_url('/demo/demo_session')}}"}, "mode": "replace"}], + "options": {"url": "{{entire_url('/scense_demo/demo_session')}}"}, "mode": "replace"}], "subwidgets": [ {"widgettype": "Text", "options": {"label": "📋 演示会话列表", "fontSize": "18px"}}, {"widgettype": "Text", "options": {"label": "查看/维护进行中的演示会话(状态隔离,只读正式数据)", "fontSize": "13px", "color": "#666666"}}