bricks/aidocs/bricks.md
2025-10-05 06:39:58 +08:00

498 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Bricks.js 技术文档
> **Bricks.js** 是一个基于 JavaScript 的前端组件化框架,用于构建可扩展、模块化的 Web 应用程序。它支持动态组件加载、事件绑定、数据实时获取、弹窗管理、国际化i18n、媒体流控制等功能。
---
## 目录
- [1. 概述](#1-概述)
- [2. 核心对象 `bricks`](#2-核心对象-bricks)
- [3. 绑定动作Bind Actions](#3-绑定动作bind-actions)
- [通用属性](#通用属性)
- [各类型绑定的特定属性](#各类型绑定的特定属性)
- [4. 工具函数](#4-工具函数)
- [`uuid()`](#uuid)
- [`deviceid(appname)`](#deviceidappname)
- [`str2data(s, d)`](#str2datas-d)
- [`apply_data(desc, data)`](#apply_datadesc-data)
- [5. 组件构建系统](#5-组件构建系统)
- [`widgetBuild(desc, widget, data)`](#widgetbuilddesc-widget-data)
- [`buildBind(w, desc)`](#buildbindw-desc)
- [`buildEventBind(from_widget, widget, event, desc)`](#buildeventbindfrom_widget-widget-event-desc)
- [`universal_handler(from_widget, widget, desc, event)`](#universal_handlerfrom_widget-widget-desc-event)
- [6. 事件处理器生成器](#6-事件处理器生成器)
- [`buildEventHandler(w, desc, event)`](#buildeventhandlerw-desc-event)
- [`getRealtimeData(w, desc)`](#getrealtimedataw-desc)
- [7. 各类 Handler 构造函数](#7-各类-handler-构造函数)
- [`buildNewWindowHandler`](#buildnewwindowhandler)
- [`buildUrlwidgetHandler`](#buildurlwidgethandler)
- [`buildBricksHandler`](#buildbrickshandler)
- [`buildRegisterFunctionHandler`](#buildregisterfunctionhandler)
- [`buildMethodHandler`](#buildmethodhandler)
- [`buildScriptHandler`](#buildscripthandler)
- [`buildDispatchEventHandler`](#builddispatcheventhandler)
- [8. 辅助函数](#8-辅助函数)
- [`getWidgetById(id, from_widget)`](#getwidgetbyidid-from_widget)
- [9. App 类 (`bricks.App`)](#9-app-类-bricksapp)
- [构造函数参数 `opts`](#构造函数参数-opts)
- [主要方法](#主要方法)
---
## 1. 概述
`bricks` 是一个全局命名空间对象,封装了整个应用的核心逻辑:
```js
var bricks = window.bricks || {};
bricks.app = null;
```
所有功能均挂载在 `bricks` 对象下,包括:
- 组件工厂Factory
- 弹窗管理Popup / PopupWindow
- HTTP 请求客户端HttpJson
- 国际化支持I18n
- 设备标识与会话管理
- 动态组件构建与事件绑定机制
---
## 2. 核心对象 `bricks`
| 属性/方法 | 类型 | 描述 |
|------------------|-----------|------|
| `app` | App 实例 | 当前应用主实例 |
| `Body` | DOM 元素包装 | 页面 body 封装 |
| `bug` / `debug` | Boolean | 是否开启调试模式 |
| `Factory` | Class | 组件注册与创建工厂 |
| `RF` | RegisterFunction | 注册函数管理器 |
---
## 3. 绑定动作Bind Actions
通过 `desc.binds` 数组定义用户交互行为,每个绑定描述符包含以下结构。
### 通用属性
所有绑定动作都具备以下字段:
| 字段名 | 类型 | 必填 | 描述 |
|------------------|----------|------|------|
| `actiontype` | String | ✅ | 动作类型:`bricks`, `urlwidget`, `method`, `script`, `registerfunction`, `event`, `newwindow` |
| `wid` | String | ✅ | 触发事件的组件 ID |
| `event` | String | ✅ | 监听的事件名称,如 `'click'` |
| `target` | String 或 Widget | ✅ | 执行目标组件或特殊值(如 `'Popup'` |
| `datawidget` | String | ❌ | 获取运行时数据的源组件 ID |
| `datamethod` | String | ❌ | 数据获取方法,默认 `'getValue'` |
| `dataparams` | Object | ❌ | 调用 `datamethod` 的参数 |
| `datascript` | String | ❌ | 自定义脚本获取数据 |
| `rtdata` | Object | ❌ | 静态运行时数据 |
| `conform` | Object | ❌ | 确认对话框配置,在执行前弹出确认窗口 |
---
### 各类型绑定的特定属性
#### `urlwidget` action
从远程 URL 加载组件描述并渲染。
| 属性 | 类型 | 描述 |
|--------|---------|------|
| `mode` | String | `'replace'`, `'insert'`, `'append'`,默认 `'replace'` |
| `options.method` | String | HTTP 方法,默认 `'GET'` |
| `options.params` | Object | 请求参数 |
| `options.url` | String | 远程组件 JSON 地址 |
#### `bricks` action
本地创建 Bricks 组件。
| 属性 | 类型 | 描述 |
|--------|---------|------|
| `mode` | String | 同上 |
| `options.widgettype` | String | 组件类型,必须已注册 |
| `options.*` | Any | 组件初始化选项 |
#### `method` action
调用目标组件的方法。
| 属性 | 类型 | 描述 |
|---------|----------|------|
| `method` | String | 方法名 |
| `params` | Object | 方法参数kwargs |
#### `script` action
执行内联脚本。
| 属性 | 类型 | 描述 |
|---------|----------|------|
| `script` | String | 可执行 JS 代码字符串(异步函数体) |
| `params` | Object | 传入脚本的参数 |
#### `registerfunction` action
调用已注册的全局函数。
| 属性 | 类型 | 描述 |
|----------|----------|------|
| `rfname` | String | 注册函数名称 |
| `params` | Object | 函数参数 |
#### `event` action
派发自定义事件。
| 属性 | 类型 | 描述 |
|------------------|----------|------|
| `dispatch_event` | String | 要派发的事件名 |
| `params` | Object | 携带的数据 |
---
## 4. 工具函数
### `uuid()`
生成唯一标识符UUID优先使用 Web Crypto API降级为随机字符串。
```js
bricks.uuid(); // 返回类似 "a1b2c3d4e5f6..."
```
- 使用 `crypto.randomUUID()`(现代浏览器)
- 若不支持,则生成 30 位随机字符(来自字母数字集)
> ⚠️ 注意:降级版本非标准 UUID仅作唯一性参考。
---
### `deviceid(appname)`
为当前设备+应用组合生成持久化设备 ID存储于 `localStorage`
```js
bricks.deviceid('myapp'); // → myappdeviceid: abcdef...
```
- Key: `${appname}deviceid`
- 自动生成并缓存,避免重复访问时变化
---
### `str2data(s, d)`
模板字符串解析函数,支持变量插值和类型转换。
**语法格式:**
```
'my name is ${name}, age ${age:type}'
```
支持的类型:
- `int`: 转为整数
- `str`: 字符串(默认)
- `json`: JSON 序列化
**示例:**
```js
bricks.str2data('Hello ${user}', { user: 'Tom' });
// → "Hello Tom"
bricks.str2data('${data:json}', { data: { x: 1 } });
// → '{"x":1}'
```
返回 `null` 如果关键变量缺失。
---
### `apply_data(desc, data)`
将数据填充到任意对象结构中(递归模板替换)。
```js
const desc = { url: '/api/${id}' };
const filled = bricks.apply_data(desc, { id: 123 });
// → { url: '/api/123' }
```
内部使用 `str2data` 处理所有字符串字段。
---
## 5. 组件构建系统
### `widgetBuild(desc, widget, data)`
根据组件描述符异步构建组件树。
**参数:**
- `desc`: 组件描述对象(含 `widgettype`, `options`, `subwidgets`, `binds`
- `widget`: 父组件(上下文)
- `data`: 初始数据,用于模板填充
**流程:**
1.`widgettype === 'urlwidget'`,先发起 HTTP 请求获取真实组件描述
2. 应用 `data` 填充模板
3. 查找组件类(通过 `Factory.get(type)`
4. 创建实例并设置 `id`
5. 递归构建子组件(`subwidgets`
6. 绑定事件(`binds`
**返回:** 构建完成的组件实例Promise
---
### `buildBind(w, desc)`
为指定组件建立事件绑定。
**步骤:**
1. 解析 `wid` 得到触发源组件
2. 调用 `buildEventBind(...)` 添加监听器
---
### `buildEventBind(from_widget, widget, event, desc)`
实际绑定事件处理器。
```js
widget.bind(event, handler);
```
处理器为 `bricks.universal_handler(from_widget, widget, desc)` 的柯里化函数。
---
### `universal_handler(from_widget, widget, desc, event)`
统一事件处理入口,支持前置确认(`conform`)。
**逻辑:**
- 若有 `conform` 配置,创建 `Conform` 弹窗,确认后再执行后续操作
- 否则直接调用 `buildEventHandler(...)`
若失败,输出调试信息。
---
## 6. 事件处理器生成器
### `buildEventHandler(w, desc, event)`
根据 `actiontype` 分发不同类型的处理器。
| actiontype | 返回处理器函数 |
|--------------------|----------------|
| `newwindow` | 新窗口打开链接 |
| `urlwidget` | 加载远程组件 |
| `bricks` | 创建本地组件 |
| `registerfunction` | 调用注册函数 |
| `method` | 调用组件方法 |
| `script` | 执行脚本 |
| `event` | 派发事件 |
同时处理:
- 实时数据提取(`rtdata` 来源:`datawidget`, `datamethod`, `datascript`
- 参数映射(`params_mapping`
- 事件参数合并
---
### `getRealtimeData(w, desc)`
从指定组件获取实时数据。
**方式:**
- `desc.method`: 调用组件方法
- `desc.script`: 执行脚本获取结果
**返回:** Promise 包裹的结果数据
---
## 7. 各类 Handler 构造函数
这些函数返回一个“延迟执行”的函数(通常用 `.bind()` 封装),供事件触发时调用。
### `buildNewWindowHandler`
打开新浏览器窗口。
- 支持参数拼接URL 查询参数)
- 使用 `_buildWidget` 渲染 `NewWindow` 组件
---
### `buildUrlwidgetHandler`
加载远程组件并在目标位置展示。
- 支持 `FormData` 特殊处理POST 提交)
- 参数自动注入 URL 或请求体
---
### `buildBricksHandler`
在目标容器中渲染本地 Bricks 组件。
- 支持 `mode`: `replace`, `insert`, `append`
- 自动处理弹窗打开Popup/PopupWindow
---
### `buildRegisterFunctionHandler`
调用通过 `bricks.RF.register(name, func)` 注册的函数。
- 参数合并策略:`desc.params` + `rtdata` + `event_params`
- 支持模板填充
---
### `buildMethodHandler`
调用目标组件上的某个方法。
```js
target[desc.method].bind(target, params)
```
适用于 `setValue`, `show`, `hide` 等组件 API。
---
### `buildScriptHandler`
动态创建异步函数并绑定执行环境。
```js
const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
new AsyncFunction('params', 'event', scriptBody);
```
可用于复杂逻辑脚本注入。
---
### `buildDispatchEventHandler`
向目标组件派发自定义事件。
```js
target.dispatch(desc.dispatch_event, mergedParams);
```
常用于跨组件通信。
---
## 8. 辅助函数
### `getWidgetById(id, from_widget)`
根据 ID 查找组件实例,支持路径表达式。
**ID 支持语法:**
- `'self'`: 当前组件
- `'root'`: 根组件
- `'app'` / `'body'`: 应用主体
- `'window'`: 浏览器窗口根元素
- `'#id'`: DOM ID 选择器
- `'-id'`: 使用 `closest()` 向上查找
**示例:**
```js
bricks.getWidgetById('loginForm.usernameInput');
```
返回匹配的 `bricks_widget` 实例或原生 DOM。
---
## 9. App 类 (`bricks.App`)
继承自 `bricks.Layout`,是整个应用的根容器。
### 构造函数参数 `opts`
| 参数 | 类型 | 描述 |
|------|------|------|
| `appname` | String | 应用名,用于设备 ID 存储 |
| `debug` | Boolean/String | 是否启用调试日志 |
| `login_url` | String | 登录页地址,默认 `/rbac/userpassword_login.ui` |
| `charsize` | Number | 字体基础大小 |
| `language` | String | 初始语言(如 `'zh-CN'` |
| `i18n.url` | String | 国际化资源接口 |
| `i18n.default_lang` | String | 默认语言 |
| `widget` | Object | 根组件描述 |
### 主要方法
| 方法 | 描述 |
|------|------|
| `run()` | 启动应用:初始化语言、构建根组件、添加至 DOM |
| `build()` | 构建根组件树 |
| `change_language(lang)` | 切换语言并通知 i18n 系统 |
| `key_down_action(event)` | 全局键盘事件捕获 |
| `new_zindex()` | 获取新的 z-index 层级 |
| `screenWidth()` / `screenHeight()` | 获取视口尺寸 |
| `save_session(session)` / `get_session()` | 会话管理 |
| `start_camera(vpos)` | 打开指定摄像头 |
| `start_mic()` | 打开麦克风 |
| `getCameras()` | 获取可用视频输入设备列表 |
| `textsize_bigger()` / `textsize_smaller()` | 调整字体大小 |
| `show_windows_panel()` | 显示多窗口面板(实验性) |
---
## 附录 A内置组件类型常见 `widgettype`
| 类型 | 说明 |
|------|------|
| `Text` | 文本显示 |
| `Button` | 按钮 |
| `Input` | 输入框 |
| `Layout` | 布局容器 |
| `Popup` | 模态弹窗 |
| `PopupWindow` | 独立窗口弹窗 |
| `Conform` | 确认对话框 |
| `NewWindow` | 新浏览器窗口包装器 |
| `WindowsPanel` | 窗口管理面板 |
---
## 附录 B调试技巧
启用调试:
```js
bricks.bug = true;
```
查看日志:
```js
console.log(...args); // 内部使用 debug 输出
```
推荐配合 Chrome DevTools 使用。
---
## 许可证
MIT License假设项目允许
---
> 📝 文档版本v1.0
> ✍️ 最后更新2025年4月5日