zc-lowcode 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +79 -72
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,26 +1,43 @@
1
- # @fp-mall/lowcode
1
+ # zc-lowcode
2
2
 
3
- 面向 fp-mall 的可视化页面搭建 SDK。提供 **设计器(Designer)** 与 **运行时(Runtime)** 两套入口,共享同一套页面 JSON 契约(`Page` / `Widget` 树)。
3
+ 可视化页面搭建 SDK,提供 **设计器(Designer)** 与 **运行时(Runtime)** 两套入口,共享同一套页面 JSON 契约(`Page` / `Widget` 树)。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install zc-lowcode
9
+ # 或
10
+ pnpm add zc-lowcode
11
+ # 或
12
+ yarn add zc-lowcode
13
+ ```
14
+
15
+ 依赖:`vue ^3.5`(peer)、`ant-design-vue`(设计器 UI)、`vuedraggable`(画布拖拽)。
4
16
 
5
17
  ## 包结构
6
18
 
7
19
  ```
8
- packages/lowcode/
20
+ code/
9
21
  ├── src/
10
- │ ├── engine/ # 核心引擎(无 UI 壳)
11
- │ │ ├── core/ # Page/Widget 类型、物料注册、页面脚本、快照、表达式
12
- │ │ └── context/ # 注入 Key、主题 token、对外 props 类型、fetch 适配器
22
+ │ ├── core/ # 核心引擎(无 UI 壳)
23
+ │ │ └── index.ts # Page/Widget 类型、物料注册、快照、命令、历史
13
24
  │ ├── materials/ # 内置物料(button、grid、tab 等)
25
+ │ │ ├── packages/ # 各物料实现(view / setter / designer)
26
+ │ │ ├── page/ # 页面根节点物料
27
+ │ │ ├── shared/ # 属性面板、设计态公共组件
14
28
  │ │ ├── definitions.ts # 设计器全量 materialDefinitions
15
- │ │ └── runtime-definitions.ts # definitions 自动生成的运行时轻量副本
29
+ │ │ └── runtime-definitions.ts # view 的运行时轻量副本
16
30
  │ ├── designer/ # 可视化设计器 UI
17
- │ │ ├── core/ # createDesigner、设计器物料注册表
18
- │ │ ├── shell/ # LowcodeDesigner 主壳与侧栏
31
+ │ │ ├── designer.ts # createDesigner、撤销/重做
32
+ │ │ ├── material-registry.ts # 设计器物料注册表
19
33
  │ │ ├── canvas/ # 画布、拖拽、选中框
20
- │ │ ├── setter/ # 属性面板与通用表单组件
21
- │ │ ├── page/ # 页面 data/methods/lifecycle 编辑器
22
- │ │ └── context/ # 设计器 ConfigProvider、inject 辅助
34
+ │ │ ├── properties/ # 属性面板
35
+ │ │ ├── outline/ # 大纲
36
+ │ │ ├── datasource/ # 数据源编辑
37
+ │ │ └── methods/ # 页面函数 / 接口配置
23
38
  │ └── runtime/ # LowcodePageRenderer 页面渲染器
39
+ │ ├── runtime.ts # 生命周期、事件、样式、注入键
40
+ │ └── widget-node.vue # 运行时组件树递归
24
41
  ├── uno.config.ts # UnoCSS 配置(runtime / designer 分 scope)
25
42
  └── vite.config.ts # 多入口 lib 构建
26
43
  ```
@@ -29,25 +46,24 @@ packages/lowcode/
29
46
 
30
47
  | 模块 | 职责 | 典型导出 |
31
48
  | --- | --- | --- |
32
- | `engine` | 类型契约、物料注册表、页面脚本执行、快照序列化 | `Page`、`clonePageSnapshot`、`useLifecycle` |
49
+ | `core` | 类型契约、物料注册表、页面树操作、快照序列化 | `Page`、`clonePageSnapshot`、`createMaterialRegistry` |
33
50
  | `materials` | 内置物料元数据与 palette 分组 | `materialDefinitions`、`runtimeMaterialDefinitions` |
34
51
  | `designer` | 可视化编辑 UI | `LowcodeDesigner`、`createDesigner` |
35
- | `runtime` | 运行时页面渲染 | `LowcodePageRenderer` |
52
+ | `runtime` | 运行时页面渲染 | `LowcodePageRenderer`、`useLifecycle` |
36
53
 
37
54
  ## 子包入口
38
55
 
39
56
  | 入口 | 用途 |
40
57
  | --- | --- |
41
- | `@fp-mall/lowcode/engine` | 类型、快照工具、页面脚本 API,无 Vue 组件 |
42
- | `@fp-mall/lowcode/materials` | 全量物料定义 `materialDefinitions`、默认注册表 |
43
- | `@fp-mall/lowcode/designer` | `LowcodeDesigner` 设计器组件 |
44
- | `@fp-mall/lowcode/runtime` | `LowcodePageRenderer` 运行时渲染器 |
45
- | `@fp-mall/lowcode/style` | 运行时样式副作用入口 |
46
- | `@fp-mall/lowcode/style/designer` | 设计器样式副作用入口 |
47
- | `@fp-mall/lowcode/style/runtime` | 同 `style` |
48
- | `@fp-mall/lowcode/uno.config` | 供消费方扩展 UnoCSS 的基准配置 |
49
-
50
- 依赖:`vue ^3.5`(peer)、`ant-design-vue`(设计器 UI)、`vuedraggable`(画布拖拽)。
58
+ | `zc-lowcode/core` | 类型、快照工具、物料注册表,无 Vue 组件 |
59
+ | `zc-lowcode/materials` | 全量物料定义 `materialDefinitions`、默认注册表 |
60
+ | `zc-lowcode/designer` | `LowcodeDesigner` 设计器组件 |
61
+ | `zc-lowcode/runtime` | `LowcodePageRenderer` 运行时渲染器 |
62
+ | `zc-lowcode/style` | 运行时样式副作用入口 |
63
+ | `zc-lowcode/style/designer` | 设计器样式副作用入口 |
64
+ | `zc-lowcode/style/runtime` | 同 `style` |
65
+ | `zc-lowcode/style/materials` | 物料相关样式副作用入口 |
66
+ | `zc-lowcode/uno.config` | 供消费方扩展 UnoCSS 的基准配置 |
51
67
 
52
68
  ---
53
69
 
@@ -57,9 +73,8 @@ packages/lowcode/
57
73
 
58
74
  - **Page** 是页面根节点,`type: 'page'`,除通用 Widget 字段外还包含:
59
75
  - `data` — 页面初始数据(设计器可编辑)
60
- - `methods` — 页面自定义函数(含 async fetch 请求)
76
+ - `methods` — 页面自定义函数(支持 API 模板生成 fetch 请求)
61
77
  - `lifecycle` — 生命周期钩子源码
62
- - `methods` — 自定义方法列表
63
78
  - **Widget** = **可持久化字段**(`WidgetPersisted`)+ **仅设计态字段**(`WidgetEditorFields`)。
64
79
 
65
80
  可持久化字段(入库 / 历史快照 / `v-model` 出站):
@@ -107,26 +122,24 @@ type MaterialDefinition = {
107
122
 
108
123
  ## 快速接入
109
124
 
110
- ### 设计器(Admin 微页面等)
125
+ ### 设计器
111
126
 
112
127
  ```vue
113
128
  <script setup lang="ts">
114
129
  import {
115
130
  LowcodeDesigner,
116
131
  createDefaultPage,
117
- type LowcodeFetchAdapter,
132
+ type LowcodeUploadHandler,
118
133
  type Page
119
- } from '@fp-mall/lowcode/designer'
120
- import { materialDefinitions } from '@fp-mall/lowcode/materials'
121
- import '@fp-mall/lowcode/style/designer'
134
+ } from 'zc-lowcode/designer'
135
+ import { materialDefinitions } from 'zc-lowcode/materials'
136
+ import 'zc-lowcode/style/designer'
122
137
 
123
138
  const page = ref<Page>(createDefaultPage())
124
139
 
125
- const fetchAdapter: LowcodeFetchAdapter = {
126
- async request(req) {
127
- // 对接宿主 HTTP 客户端;页面接口、图片上传等均通过此适配器
128
- return { ok: true, status: 200, data: /* ... */ }
129
- }
140
+ const uploadHandler: LowcodeUploadHandler = async ({ file }) => {
141
+ // 对接宿主上传接口,返回图片 URL
142
+ return 'https://example.com/uploaded.png'
130
143
  }
131
144
  </script>
132
145
 
@@ -134,7 +147,7 @@ const fetchAdapter: LowcodeFetchAdapter = {
134
147
  <LowcodeDesigner
135
148
  v-model:page="page"
136
149
  :definitions="materialDefinitions"
137
- :fetch-adapter="fetchAdapter"
150
+ :upload-handler="uploadHandler"
138
151
  :theme="theme"
139
152
  :locale="locale"
140
153
  />
@@ -145,18 +158,16 @@ const fetchAdapter: LowcodeFetchAdapter = {
145
158
 
146
159
  - **必须** 传入 `:definitions`(通常用 `materialDefinitions`)。
147
160
  - 通过 `v-model:page` 双向绑定;出站数据已是剥离编辑态字段的快照。
148
- - `fetchAdapter` 用于页面 API、Setter 内图片上传等网络请求。
161
+ - `uploadHandler` 用于 Setter 内图片上传等场景。
149
162
  - `theme` / `locale` 与 Ant Design Vue `ConfigProvider` 一致。
150
163
 
151
- 参考:`admin/src/pages/setting/micropages/edit/index.vue`。
152
-
153
- ### 运行时(Portal 等)
164
+ ### 运行时
154
165
 
155
166
  ```vue
156
167
  <script setup lang="ts">
157
- import { LowcodePageRenderer, type Page } from '@fp-mall/lowcode/runtime'
158
- import { clonePageSnapshot } from '@fp-mall/lowcode/engine'
159
- import '@fp-mall/lowcode/style'
168
+ import { LowcodePageRenderer, type Page } from 'zc-lowcode/runtime'
169
+ import { clonePageSnapshot } from 'zc-lowcode/core'
170
+ import 'zc-lowcode/style'
160
171
 
161
172
  const page = ref<Page>(/* 从接口加载的 JSON */)
162
173
 
@@ -166,7 +177,6 @@ const page = ref<Page>(/* 从接口加载的 JSON */)
166
177
  <template>
167
178
  <LowcodePageRenderer
168
179
  :page="page"
169
- :fetch-adapter="fetchAdapter"
170
180
  :theme="theme"
171
181
  :locale="locale"
172
182
  />
@@ -179,8 +189,6 @@ const page = ref<Page>(/* 从接口加载的 JSON */)
179
189
  - 也可传入自定义 `:definitions`,须保证 `type` 与持久化 JSON 一致。
180
190
  - **不要** 把带 `component` / `setterComponent` 的设计态 JSON 原样落库;服务端存 `clonePageSnapshot` 结果即可。
181
191
 
182
- 参考:`portal/app/pages/index.vue`(开发阶段可能内联 page JSON,生产应从接口读取)。
183
-
184
192
  ---
185
193
 
186
194
  ## 页面脚本
@@ -190,7 +198,7 @@ Page 级脚本能力由 `useLifecycle` 驱动,设计器与运行时共用实
190
198
  | 能力 | 字段 | 说明 |
191
199
  | --- | --- | --- |
192
200
  | 数据 | `page.data` | `PageDataItem[]`,编译为 `context.data` |
193
- | 方法 | `page.methods` | 可绑定到组件事件与 `{{ }}`;HTTP 请求通过 async 函数 + fetch 实现 |
201
+ | 方法 | `page.methods` | 可绑定到组件事件与 `{{ }}`;支持手写脚本或 API 模板(生成 fetch 请求) |
194
202
  | 生命周期 | `page.lifecycle` | `beforeMount`、`mounted` 等 |
195
203
 
196
204
  运行时上下文 `PageScriptContext`:
@@ -223,7 +231,7 @@ View 组件内通过 `useWidgetEvents` 获取 `domEventHandlers`,挂到根元
223
231
  每个物料建议目录结构:
224
232
 
225
233
  ```
226
- src/materials/{type}/
234
+ src/materials/packages/{type}/
227
235
  ├── index.ts # Widget 元数据 + 导出
228
236
  ├── options.ts # 类型、默认值、ensureXxxOptions、样式/布局工具
229
237
  ├── view.vue # 运行时 & 无 designer 时的画布渲染
@@ -238,8 +246,8 @@ src/materials/{type}/
238
246
  import View from './view.vue'
239
247
  import Setter from './setter.vue'
240
248
  import Icon from './icon.svg'
241
- import type { Widget } from '../../engine/core/widget-base.ts'
242
- import { COMMON_CONTAINER_EVENT_PRESETS } from '../../engine/core/event-presets.ts'
249
+ import type { Widget } from '../../../core/index.ts'
250
+ import { COMMON_CONTAINER_EVENT_PRESETS } from '../../../core/index.ts'
243
251
  import { ensureMyOptions } from './options.ts'
244
252
 
245
253
  const widget: Widget = {
@@ -281,7 +289,7 @@ export default widget
281
289
  在 `src/materials/definitions.ts` 追加:
282
290
 
283
291
  ```ts
284
- import myWidget from './my-widget/index.ts'
292
+ import myWidget from './packages/my-widget/index.ts'
285
293
 
286
294
  export const materialDefinitions: MaterialDefinition[] = [
287
295
  // ...
@@ -308,7 +316,7 @@ export const materialDefinitions: MaterialDefinition[] = [
308
316
  - 子项挂在 `container.children`,由 `options.activeKey` 控制当前项
309
317
  - 配置 `keyedSlotConfig` + `normalize` + 通常 `copyNeedsNormalize: true`
310
318
 
311
- 推荐使用 `createKeyedSlotMaterialHelpers`(`engine/core/keyed-slot.ts`)生成:
319
+ 推荐使用 `createKeyedSlotMaterialHelpers`(`runtime/runtime.ts`)生成:
312
320
 
313
321
  - `keyedSlotConfig`
314
322
  - `normalizeWidget`
@@ -329,7 +337,7 @@ View 通过 `<slot name="item" :item :index :visible />` 暴露子项;`widget-
329
337
  ## 设计器架构要点
330
338
 
331
339
  - `createDesigner()` 管理页面树、选中态、撤销/重做(快照栈,默认 20 步,350ms 防抖)。
332
- - `createDesignerMaterialRegistry()` 在 engine 注册表上扩展 palette 分组与设计态组件解析。
340
+ - `createDesignerMaterialRegistry()` 在 core 注册表上扩展 palette 分组与设计态组件解析。
333
341
  - 画布:`DesignerWidgetNode` → 有 `designerComponent` 则渲染设计外壳,否则渲染 view;运行时递归渲染在 `widget-node.vue`(内部组件,不对外导出)中,与设计器共享 `useWidgetNodeContext`。
334
342
  - 外部 `v-model:page` 变更会 `loadPage`;内部编辑会 `clonePageSnapshot` 回写,避免编辑态字段泄漏。
335
343
 
@@ -340,7 +348,7 @@ View 通过 `<slot name="item" :item :index :visible />` 暴露子项;`widget-
340
348
  | `DESIGNER_KEY` | 设计器实例 |
341
349
  | `MATERIAL_REGISTRY_KEY` | 物料注册表(可用 `useMaterialRegistry()` 注入) |
342
350
  | `LOWCODE_DESIGN_MODE_KEY` | 是否设计模式 |
343
- | `LOWCODE_FETCH_KEY` | HTTP 适配器 |
351
+ | `LOWCODE_UPLOAD_KEY` | 图片上传 handler |
344
352
  | `LIFECYCLE_KEY` | 页面脚本运行时 |
345
353
 
346
354
  ---
@@ -360,14 +368,13 @@ View 通过 `<slot name="item" :item :index :visible />` 暴露子项;`widget-
360
368
 
361
369
  | 路径 | 约定 |
362
370
  | --- | --- |
363
- | `engine/core/page-script.ts` | 页面脚本运行时(data/methods/lifecycle/events),勿与 `src/runtime/` 混淆 |
364
- | `engine/core/material.ts` | 物料注册表与组件名解析 |
365
- | `designer/core/designer-material-registry.ts` | 设计器物料注册表(palette 分组、设计态 view 解析) |
366
- | `designer/page/page-editor-presets.ts` | 页面编辑器 UI 预设文案(非 Page options schema) |
367
- | `materials/{type}/options.ts` | 物料 options 类型与默认值 |
368
- | `materials/{type}/view.vue` | 运行时 view |
369
- | `materials/{type}/setter.vue` | 属性面板 |
370
- | `materials/{type}/designer.vue` | 可选设计态外壳 |
371
+ | `core/index.ts` | 核心模型、物料注册、快照、命令、历史 |
372
+ | `runtime/runtime.ts` | 页面脚本运行时、事件、样式、注入键 |
373
+ | `designer/material-registry.ts` | 设计器物料注册表(palette 分组、设计态 view 解析) |
374
+ | `materials/packages/{type}/options.ts` | 物料 options 类型与默认值 |
375
+ | `materials/packages/{type}/view.vue` | 运行时 view |
376
+ | `materials/packages/{type}/setter.vue` | 属性面板 |
377
+ | `materials/packages/{type}/designer.vue` | 可选设计态外壳 |
371
378
 
372
379
  ### 数据与 API 命名
373
380
 
@@ -381,21 +388,22 @@ View 通过 `<slot name="item" :item :index :visible />` 暴露子项;`widget-
381
388
 
382
389
  ---
383
390
 
384
- ## 构建与开发
391
+ ## 构建与发布
385
392
 
386
393
  ```bash
387
- # 在 monorepo 根目录或 packages/lowcode
388
- pnpm --filter @fp-mall/lowcode build # 生产构建 → dist/
389
- pnpm --filter @fp-mall/lowcode dev # watch 模式
394
+ # 在 code/ 目录下
395
+ npm run build # 生产构建 → dist/
396
+ npm run dev # watch 模式
397
+ npm run release # build + 发布到 npm(需先 npm login)
390
398
  ```
391
399
 
392
400
  构建产物:
393
401
 
394
- - `dist/engine.js`、`dist/materials.js`、`dist/designer.js`、`dist/runtime.js`
402
+ - `dist/core.js`、`dist/materials.js`、`dist/designer.js`、`dist/runtime.js`
395
403
  - 对应 `.d.ts` 与 CSS 资源
396
404
  - `designer.d.ts` / `runtime.d.ts` 为 Vue 组件类型 shim
397
405
 
398
- 修改物料或引擎后需重新 build,Admin / Portal 才能引用最新 dist。
406
+ 修改物料或引擎后需重新 build,消费方才能引用最新 dist。
399
407
 
400
408
  ---
401
409
 
@@ -404,11 +412,10 @@ pnpm --filter @fp-mall/lowcode dev # watch 模式
404
412
  | type | 名称 | 分组 | 说明 |
405
413
  | --- | --- | --- | --- |
406
414
  | `grid` | 容器 | 容器组件 | 支持结构化行列布局 |
407
- | `section` | 区块 | 容器组件 | |
408
415
  | `card` | 卡片 | 容器组件 | |
409
416
  | `tab` | 标签页 | 容器组件 | Keyed Slot,子类型 `tab-pane` |
410
417
  | `carousel` | 走马灯 | 容器组件 | Keyed Slot,子类型 `carousel-slide` |
411
- | `list` | 列表 | 容器组件 | 循环渲染,子类型 `list-item` |
418
+ | `list` | 列表 | 容器组件 | 绑定数据源循环渲染 |
412
419
  | `button` | 按钮 | 基础组件 | |
413
420
  | `image` | 图片 | 基础组件 | |
414
421
  | `text` | 文本 | 基础组件 | |
@@ -426,7 +433,7 @@ A: 不要。始终用 `clonePageSnapshot` / `serializePageSnapshot` 出站;运
426
433
  A: `type` 必须与持久化 JSON 一致;运行时只需 view 链,可不含 setter/designer,体积更小。
427
434
 
428
435
  **Q: 如何扩展页面 HTTP?**
429
- A: HTTP 请求在 `page.methods` 中编写 async 函数,通过 `fetch` 实现,在生命周期或事件中 `await context.methods.xxx(...)` 调用。
436
+ A: 在设计器「函数」面板使用 API 模板配置请求,或手写 `page.methods` 中的 async 函数(内部使用 `fetch`),在生命周期或事件中 `await context.methods.xxx(...)` 调用。
430
437
 
431
438
  **Q: 复制 tab/carousel 后子项错乱?**
432
439
  A: 容器 Widget 应设置 `copyNeedsNormalize: true` 并提供 `normalize`,复制后会重新分配 id 并规范化子树。
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "lowcode",
9
9
  "lowcode-editor"
10
10
  ],
11
- "version": "0.0.3",
11
+ "version": "0.0.4",
12
12
  "type": "module",
13
13
  "sideEffects": [
14
14
  "**/*.css",