运行时怎么串起来
菜单
└─ /page/run?param={页面 id}
├─ 读出 sys.page_def 的 JSON
├─ 收集里面的 sql_id,写入本次会话的白名单
└─ plus/ 按 Body[].Type 加载组件并渲染
组件需要数据时
└─ POST /sql/run { sql_id, ...参数 }
├─ 白名单里没有这条 sql_id → 拒绝
└─ 有 → 在一个事务里执行 pre_sql、main_sql、post_sql四层各管一件事:
| 层 | 放什么 | 改它的时候 |
|---|---|---|
sys.page_def | 布局 JSON | 页面编辑器 /page_editor |
sys.page_sql | 查询和保存 SQL | SQL 编辑器 /sql_editor |
plus/ | 把 JSON 画成表格、表单等 | 改引擎脚本,并更新资源版本号 |
/sql/run | 按白名单执行 SQL | 后端 SQL 引擎 |
页面 JSON 是类 JSON5:允许尾逗号,前端用 eval 解析。任意字符串值可以写成 "js:表达式",运行时再求值。见 页面 JSON。
/sql/run 不接受任意 SQL。用户必须先打开页面,后端才把这一页声明过的 sql_id 放进会话。没打开页面就直接调,一定被拒绝。弹窗里的子页还要在父页的 SubPages 里声明。见 权限与 SQL 白名单。