fix: 部署对齐——包名/URL前缀/模型格式/补json-build.sh,目标机json2ddl实测通过
This commit is contained in:
parent
d6ff0c9bc9
commit
408fb03dc6
2
json/build.sh
Executable file
2
json/build.sh
Executable file
@ -0,0 +1,2 @@
|
||||
#!/usr/bin/bash
|
||||
xls2ui -m ../models -o ../wwwroot scense_demo *.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": []
|
||||
}
|
||||
}
|
||||
@ -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": []
|
||||
}
|
||||
}
|
||||
@ -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": []
|
||||
}
|
||||
}
|
||||
@ -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": []
|
||||
}
|
||||
}
|
||||
@ -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*"]
|
||||
|
||||
@ -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',
|
||||
]
|
||||
|
||||
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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 = {
|
||||
|
||||
@ -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"}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user