fix: 部署对齐——包名/URL前缀/模型格式/补json-build.sh,目标机json2ddl实测通过

This commit is contained in:
pipeline-agent 2026-08-29 23:07:27 +08:00
parent d6ff0c9bc9
commit 408fb03dc6
13 changed files with 302 additions and 85 deletions

2
json/build.sh Executable file
View File

@ -0,0 +1,2 @@
#!/usr/bin/bash
xls2ui -m ../models -o ../wwwroot scense_demo *.json

View File

@ -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": []
}
}

View File

@ -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": []
}
}

View File

@ -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": []
}
}

View File

@ -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": []
}
}

View File

@ -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*"]

View File

@ -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',
]

View File

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

View File

@ -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 = {

View File

@ -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"}}