ice-entity-designer 0.0.16 → 0.0.18
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.
- package/LICENSE +21 -21
- package/README.md +287 -26
- package/dist/index.cjs +30 -0
- package/dist/index.mjs +30 -0
- package/dist/index.umd.js +10 -5
- package/dist/react.cjs +30 -0
- package/dist/react.mjs +30 -0
- package/dist/types/designer/EntityDesigner.d.mts +102 -0
- package/dist/types/designer/EntityDesigner.d.ts +102 -0
- package/dist/types/er-component/Entity.d.mts +104 -0
- package/dist/types/er-component/Entity.d.ts +104 -62
- package/dist/types/er-component/Relation.d.mts +50 -0
- package/dist/types/er-component/Relation.d.ts +50 -24
- package/dist/types/gl-matrix.d.mts +3273 -0
- package/dist/types/gl-matrix.d.ts +3273 -0
- package/dist/types/ice-render/FrameManager.d.mts +26 -0
- package/dist/types/ice-render/FrameManager.d.ts +26 -0
- package/dist/types/ice-render/ICE.d.mts +369 -0
- package/dist/types/ice-render/ICE.d.ts +369 -0
- package/dist/types/ice-render/a11y/accessibility.d.mts +46 -0
- package/dist/types/ice-render/a11y/accessibility.d.ts +46 -0
- package/dist/types/ice-render/animation/AnimationManager.d.mts +96 -0
- package/dist/types/ice-render/animation/AnimationManager.d.ts +96 -0
- package/dist/types/ice-render/animation/Easing.d.mts +33 -0
- package/dist/types/ice-render/animation/Easing.d.ts +33 -0
- package/dist/types/ice-render/consts/BIG_ZINDEX_NUMBER.d.mts +14 -0
- package/dist/types/ice-render/consts/BIG_ZINDEX_NUMBER.d.ts +14 -0
- package/dist/types/ice-render/consts/COMPONENT_TYPE_MAPPING.d.mts +45 -0
- package/dist/types/ice-render/consts/COMPONENT_TYPE_MAPPING.d.ts +45 -0
- package/dist/types/ice-render/consts/DOM_EVENT_MAPPING_CONSTS.d.mts +37 -0
- package/dist/types/ice-render/consts/DOM_EVENT_MAPPING_CONSTS.d.ts +37 -0
- package/dist/types/ice-render/consts/ICE_EVENT_NAME_CONSTS.d.mts +27 -0
- package/dist/types/ice-render/consts/ICE_EVENT_NAME_CONSTS.d.ts +27 -0
- package/dist/types/ice-render/control-panel/AlignmentGuideManager.d.mts +92 -0
- package/dist/types/ice-render/control-panel/AlignmentGuideManager.d.ts +92 -0
- package/dist/types/ice-render/control-panel/ICEControlPanel.d.mts +37 -0
- package/dist/types/ice-render/control-panel/ICEControlPanel.d.ts +37 -0
- package/dist/types/ice-render/control-panel/ICEControlPanelManager.d.mts +25 -0
- package/dist/types/ice-render/control-panel/ICEControlPanelManager.d.ts +25 -0
- package/dist/types/ice-render/control-panel/link-controls/LineControlPanel.d.mts +39 -0
- package/dist/types/ice-render/control-panel/link-controls/LineControlPanel.d.ts +39 -0
- package/dist/types/ice-render/control-panel/transform-controls/ResizeControl.d.mts +38 -0
- package/dist/types/ice-render/control-panel/transform-controls/ResizeControl.d.ts +38 -0
- package/dist/types/ice-render/control-panel/transform-controls/RotateControl.d.mts +12 -0
- package/dist/types/ice-render/control-panel/transform-controls/RotateControl.d.ts +12 -0
- package/dist/types/ice-render/control-panel/transform-controls/TransformControlPanel.d.mts +83 -0
- package/dist/types/ice-render/control-panel/transform-controls/TransformControlPanel.d.ts +83 -0
- package/dist/types/ice-render/control-panel/transform-controls/constraints.d.mts +24 -0
- package/dist/types/ice-render/control-panel/transform-controls/constraints.d.ts +24 -0
- package/dist/types/ice-render/cross-platform/PolyfillPath2D.d.mts +31 -0
- package/dist/types/ice-render/cross-platform/PolyfillPath2D.d.ts +31 -0
- package/dist/types/ice-render/cross-platform/root.d.mts +7 -0
- package/dist/types/ice-render/cross-platform/root.d.ts +7 -0
- package/dist/types/ice-render/event/DOMEventDispatcher.d.mts +68 -0
- package/dist/types/ice-render/event/DOMEventDispatcher.d.ts +68 -0
- package/dist/types/ice-render/event/DOMEventInterceptor.d.mts +36 -0
- package/dist/types/ice-render/event/DOMEventInterceptor.d.ts +36 -0
- package/dist/types/ice-render/event/EventBus.d.mts +27 -0
- package/dist/types/ice-render/event/EventBus.d.ts +27 -0
- package/dist/types/ice-render/event/ICEEvent.d.mts +46 -0
- package/dist/types/ice-render/event/ICEEvent.d.ts +46 -0
- package/dist/types/ice-render/event/ICEEventTarget.d.mts +106 -0
- package/dist/types/ice-render/event/ICEEventTarget.d.ts +106 -0
- package/dist/types/ice-render/event/input-normalize.d.mts +75 -0
- package/dist/types/ice-render/event/input-normalize.d.ts +75 -0
- package/dist/types/ice-render/geometry/GeoLine.d.mts +24 -0
- package/dist/types/ice-render/geometry/GeoLine.d.ts +24 -0
- package/dist/types/ice-render/geometry/GeoPoint.d.mts +53 -0
- package/dist/types/ice-render/geometry/GeoPoint.d.ts +53 -0
- package/dist/types/ice-render/geometry/GeoUtil.d.mts +73 -0
- package/dist/types/ice-render/geometry/GeoUtil.d.ts +73 -0
- package/dist/types/ice-render/geometry/ICEBoundingBox.d.mts +81 -0
- package/dist/types/ice-render/geometry/ICEBoundingBox.d.ts +81 -0
- package/dist/types/ice-render/graphic/ICEComponent.d.mts +486 -0
- package/dist/types/ice-render/graphic/ICEComponent.d.ts +486 -0
- package/dist/types/ice-render/graphic/ICEDotPath.d.mts +99 -0
- package/dist/types/ice-render/graphic/ICEDotPath.d.ts +99 -0
- package/dist/types/ice-render/graphic/ICEImage.d.mts +17 -0
- package/dist/types/ice-render/graphic/ICEImage.d.ts +17 -0
- package/dist/types/ice-render/graphic/ICEPath.d.mts +39 -0
- package/dist/types/ice-render/graphic/ICEPath.d.ts +39 -0
- package/dist/types/ice-render/graphic/container/ICEGroup.d.mts +101 -0
- package/dist/types/ice-render/graphic/container/ICEGroup.d.ts +101 -0
- package/dist/types/ice-render/graphic/link/ICEBezier.d.mts +23 -0
- package/dist/types/ice-render/graphic/link/ICEBezier.d.ts +23 -0
- package/dist/types/ice-render/graphic/link/ICELinkHook.d.mts +52 -0
- package/dist/types/ice-render/graphic/link/ICELinkHook.d.ts +52 -0
- package/dist/types/ice-render/graphic/link/ICELinkSlot.d.mts +54 -0
- package/dist/types/ice-render/graphic/link/ICELinkSlot.d.ts +54 -0
- package/dist/types/ice-render/graphic/link/ICELinkSlotManager.d.mts +28 -0
- package/dist/types/ice-render/graphic/link/ICELinkSlotManager.d.ts +28 -0
- package/dist/types/ice-render/graphic/link/ICEPolyLine.d.mts +292 -0
- package/dist/types/ice-render/graphic/link/ICEPolyLine.d.ts +292 -0
- package/dist/types/ice-render/graphic/link/ICEVisioLink.d.mts +163 -0
- package/dist/types/ice-render/graphic/link/ICEVisioLink.d.ts +163 -0
- package/dist/types/ice-render/graphic/shape/ICECircle.d.mts +19 -0
- package/dist/types/ice-render/graphic/shape/ICECircle.d.ts +19 -0
- package/dist/types/ice-render/graphic/shape/ICEEllipse.d.mts +29 -0
- package/dist/types/ice-render/graphic/shape/ICEEllipse.d.ts +29 -0
- package/dist/types/ice-render/graphic/shape/ICEIsogon.d.mts +52 -0
- package/dist/types/ice-render/graphic/shape/ICEIsogon.d.ts +52 -0
- package/dist/types/ice-render/graphic/shape/ICERect.d.mts +10 -0
- package/dist/types/ice-render/graphic/shape/ICERect.d.ts +10 -0
- package/dist/types/ice-render/graphic/shape/ICERose.d.mts +41 -0
- package/dist/types/ice-render/graphic/shape/ICERose.d.ts +41 -0
- package/dist/types/ice-render/graphic/shape/ICEStar.d.mts +45 -0
- package/dist/types/ice-render/graphic/shape/ICEStar.d.ts +45 -0
- package/dist/types/ice-render/graphic/text/ICEText.d.mts +137 -0
- package/dist/types/ice-render/graphic/text/ICEText.d.ts +137 -0
- package/dist/types/ice-render/index.d.mts +55 -0
- package/dist/types/ice-render/index.d.ts +55 -0
- package/dist/types/ice-render/layout/ICEBorderLayout.d.mts +34 -0
- package/dist/types/ice-render/layout/ICEBorderLayout.d.ts +34 -0
- package/dist/types/ice-render/layout/ICEBoxLayout.d.mts +30 -0
- package/dist/types/ice-render/layout/ICEBoxLayout.d.ts +30 -0
- package/dist/types/ice-render/layout/ICECardLayout.d.mts +36 -0
- package/dist/types/ice-render/layout/ICECardLayout.d.ts +36 -0
- package/dist/types/ice-render/layout/ICEFlowLayout.d.mts +31 -0
- package/dist/types/ice-render/layout/ICEFlowLayout.d.ts +31 -0
- package/dist/types/ice-render/layout/ICEGridLayout.d.mts +33 -0
- package/dist/types/ice-render/layout/ICEGridLayout.d.ts +33 -0
- package/dist/types/ice-render/layout/ICELayeredLayout.d.mts +49 -0
- package/dist/types/ice-render/layout/ICELayeredLayout.d.ts +49 -0
- package/dist/types/ice-render/layout/ICELayoutManager.d.mts +33 -0
- package/dist/types/ice-render/layout/ICELayoutManager.d.ts +33 -0
- package/dist/types/ice-render/layout/ICEOverlayLayout.d.mts +25 -0
- package/dist/types/ice-render/layout/ICEOverlayLayout.d.ts +25 -0
- package/dist/types/ice-render/persistence/Deserializer.d.mts +43 -0
- package/dist/types/ice-render/persistence/Deserializer.d.ts +43 -0
- package/dist/types/ice-render/persistence/Serializer.d.mts +35 -0
- package/dist/types/ice-render/persistence/Serializer.d.ts +35 -0
- package/dist/types/ice-render/plugin/PluginHost.d.mts +86 -0
- package/dist/types/ice-render/plugin/PluginHost.d.ts +86 -0
- package/dist/types/ice-render/renderer/CanvasRenderer.d.mts +150 -0
- package/dist/types/ice-render/renderer/CanvasRenderer.d.ts +150 -0
- package/dist/types/ice-render/renderer/ObjectCache.d.mts +79 -0
- package/dist/types/ice-render/renderer/ObjectCache.d.ts +79 -0
- package/dist/types/ice-render/renderer/dirty-rect-util.d.mts +86 -0
- package/dist/types/ice-render/renderer/dirty-rect-util.d.ts +86 -0
- package/dist/types/ice-render/theme/ICETheme.d.mts +382 -0
- package/dist/types/ice-render/theme/ICETheme.d.ts +382 -0
- package/dist/types/ice-render/util/ImageCache.d.mts +19 -0
- package/dist/types/ice-render/util/ImageCache.d.ts +19 -0
- package/dist/types/ice-render/util/data-util.d.mts +43 -0
- package/dist/types/ice-render/util/data-util.d.ts +43 -0
- package/dist/types/ice-render/util/gl-matrix-skew.d.mts +14 -0
- package/dist/types/ice-render/util/gl-matrix-skew.d.ts +14 -0
- package/dist/types/ice-render/util/lang.d.mts +28 -0
- package/dist/types/ice-render/util/lang.d.ts +28 -0
- package/dist/types/ice-render/util/uuid.d.mts +1 -0
- package/dist/types/ice-render/util/uuid.d.ts +1 -0
- package/dist/types/index.d.mts +30 -0
- package/dist/types/index.d.ts +30 -10
- package/dist/types/react/EntityDesignerCanvas.d.mts +12 -0
- package/dist/types/react/EntityDesignerCanvas.d.ts +12 -0
- package/dist/types/react/context.d.mts +25 -0
- package/dist/types/react/context.d.ts +25 -0
- package/dist/types/react/index.d.mts +17 -0
- package/dist/types/react/index.d.ts +17 -0
- package/dist/types/react/session.d.mts +30 -0
- package/dist/types/react/session.d.ts +30 -0
- package/dist/types/react/types.d.mts +64 -0
- package/dist/types/react/types.d.ts +64 -0
- package/dist/types/utils/camelcase_util.d.mts +4 -0
- package/dist/types/utils/camelcase_util.d.ts +4 -4
- package/dist/types/utils/component_type_util.d.mts +4 -0
- package/dist/types/utils/component_type_util.d.ts +4 -0
- package/dist/types/utils/pluralize_util.d.mts +25 -0
- package/dist/types/utils/pluralize_util.d.ts +25 -25
- package/dist/types/utils/project_schema.d.mts +27 -0
- package/dist/types/utils/project_schema.d.ts +27 -0
- package/dist/types/utils/schema_validator.d.mts +10 -0
- package/dist/types/utils/schema_validator.d.ts +10 -0
- package/dist/types/utils/serialization_util.d.mts +2 -0
- package/dist/types/utils/serialization_util.d.ts +2 -2
- package/package.json +145 -96
- package/react.d.ts +2 -0
- package/react.js +3 -0
- package/dist/index.cjs.js +0 -25
- package/dist/index.js +0 -25
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2022 大漠穷秋
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 大漠穷秋
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,26 +1,287 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<img width="
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
|
-
<h1 align="center">IED
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img width="120" src="./tests/assets/ice-entity-designer.png" alt="ice entity designer" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">IED · ice entity designer</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">基于 ice-render 的可视化 ER 建模工具:拖拽建图,一键导出 TypeORM Schema。</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="./LICENSE"><img alt="license" src="https://img.shields.io/badge/license-MIT-047857.svg" /></a>
|
|
11
|
+
<img alt="engine bundled" src="https://img.shields.io/badge/engine-bundled-047857.svg" />
|
|
12
|
+
<img alt="tests" src="https://img.shields.io/badge/jest-15%20passed-047857.svg" />
|
|
13
|
+
<img alt="typescript" src="https://img.shields.io/badge/TypeScript-4.6-3178c6.svg" />
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
## 1. 项目定位
|
|
17
|
+
|
|
18
|
+
IED(ice entity designer)是基于 [ice-render](https://github.com/ice-render/ice-render) 构建的**可视化 Entity-Relation 建模工具**。它以「节点 = 实体,连线 = 关系」组织数据模型,把画布上的设计结果序列化为符合 TypeORM `EntitySchema` 规范的 Schema,从而将「结构设计」与「实体类 / CRUD 代码生成」直接衔接。
|
|
19
|
+
|
|
20
|
+
它不重复实现底层图元,而是在 ice-render 的通用图编辑内核之上,收敛出 ER 建模最常用的交互闭环:选择、创建、更新、删除、关系连接、校验与 Schema 输出。
|
|
21
|
+
|
|
22
|
+
> **引擎内核已打包进本包**:安装 `ice-entity-designer` 即可直接使用,无需再安装 `ice-render`——内核在构建时被打进产物并从本包一并导出(含完整类型声明),保证 `ICE` 实例与 `Entity` / `Relation` 组件来自同一份内核。
|
|
23
|
+
|
|
24
|
+
完整使用案例请参见:
|
|
25
|
+
|
|
26
|
+
- <https://github.com/craft-codeless-designer/craft-codeless-designer-server-koa>
|
|
27
|
+
|
|
28
|
+
## 2. 核心能力
|
|
29
|
+
|
|
30
|
+
### 可视化建模
|
|
31
|
+
|
|
32
|
+
- 拖拽编辑实体:实体名、字段类型、长度、默认值、注释。
|
|
33
|
+
- 字段级约束标记:`PK` / `FK` / `UQ` / `AI` / `NN`,并支持 `index`。
|
|
34
|
+
- 实体表头、字段文本、分隔线样式均可配置(`headerStyle` / `fieldStyle` / `dividerStyle`)。
|
|
35
|
+
|
|
36
|
+
### 关系表达
|
|
37
|
+
|
|
38
|
+
- 覆盖四种关系:`one-to-one` / `one-to-many` / `many-to-one` / `many-to-many`。
|
|
39
|
+
- **连线形态可切换**:`linkShape: 'visio' | 'bezier'`(默认 `visio`)。Visio 是引擎的正交折线(出口点 + 路径评分),
|
|
40
|
+
贝塞尔是沿插槽法线出/入的三次曲线。编辑器里改连线形态有两个入口:选中连线后用**关系属性面板**的「连线形态」下拉,
|
|
41
|
+
或用**工具栏**的同名下拉 —— 选中连线时它直接改这条线,未选中时它同时作为新建连线的默认形态。
|
|
42
|
+
- 支持自引用关系,并可指定 `parent` / `children` 属性名。
|
|
43
|
+
- 关系语义完整:`onDelete` / `onUpdate` / `joinTableName`,以及自定义两端基数(如 `1 : 0..N`)。
|
|
44
|
+
- 连线标签自动呈现基数与约束(如 `1 : 1 ON DELETE CASCADE`)。
|
|
45
|
+
|
|
46
|
+
### 导出与校验
|
|
47
|
+
|
|
48
|
+
- **一键导出 TypeORM Schema**:`toSchemaObject()` / `toSchemaString()` 输出符合 TypeORM `EntitySchema` 规范的普通对象,可直接 `new EntitySchema(obj)` 使用。
|
|
49
|
+
- **关系外键归属自动判定**:`one-to-many` / `one-to-one` 的外键在目标侧、`many-to-one` 的外键在源侧,`joinColumn` 自动落在持有外键的一端;`many-to-many` 生成 `joinTable` 并在反向侧补全 `inverseSide`。
|
|
50
|
+
- **列类型规范化**:`number → int`、`string → varchar`、`boolean → boolean`、`decimal(12,2) → precision/scale`;非字符串类型不保留 `length`。
|
|
51
|
+
- **内置 Schema 校验**:重名实体、重复字段、未命名字段、悬空关系、`many-to-many` 缺少 `joinTableName` 等。
|
|
52
|
+
- **双向关系补全**:按关系类型自动补全反向属性与 `inverseSide`,`many-to-many` 自动生成复数形式的集合属性。
|
|
53
|
+
|
|
54
|
+
### 编辑器内核能力(继承自 ice-render)
|
|
55
|
+
|
|
56
|
+
- 画布滚轮缩放、空白处拖拽平移。
|
|
57
|
+
- 拖拽对齐辅助线与磁吸效果。
|
|
58
|
+
- Undo / Redo(基于项目快照,最多 100 步)。
|
|
59
|
+
- 项目级保存 / 加载(`serializeProject()` / `loadProject()`)。
|
|
60
|
+
|
|
61
|
+
## 3. 界面预览
|
|
62
|
+
|
|
63
|
+
完整的 ER 模型(电商交易 + 用户权限):
|
|
64
|
+
|
|
65
|
+
<img src="./tests/assets/overview.png" alt="ER 模型总览" />
|
|
66
|
+
|
|
67
|
+
实体字段与约束标记:
|
|
68
|
+
|
|
69
|
+
<img src="./tests/assets/fields.png" alt="实体字段与约束" />
|
|
70
|
+
|
|
71
|
+
关系语义:自引用、多对多、一对一:
|
|
72
|
+
|
|
73
|
+
<img src="./tests/assets/relations.png" alt="关系语义" />
|
|
74
|
+
|
|
75
|
+
交互式编辑器(右侧面板可直接切换到「TypeORM Schema」查看导出结果):
|
|
76
|
+
|
|
77
|
+
<img src="./tests/assets/editor.png" alt="交互式编辑器与 TypeORM Schema" />
|
|
78
|
+
|
|
79
|
+
## 4. 快速开始
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm install
|
|
83
|
+
npm run build
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
可运行的示例(`tests/` 下的页面会加载同级 `dist` 与 `node_modules`,建议通过静态服务器打开):
|
|
87
|
+
|
|
88
|
+
| 示例 | 说明 |
|
|
89
|
+
|---|---|
|
|
90
|
+
| `tests/entity-editor.html` | 交互式编辑器:实时编辑字段、创建/删除实体与关系、校验与保存加载;右侧面板含「TypeORM Schema」标签页 |
|
|
91
|
+
| [`ice-entity-designer-react-demo`](../ice-entity-designer-react-demo) | 独立的 React 集成示例工程(webpack + TypeScript),涵盖 ref / hook / onChange / 受控模式 |
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
python3 -m http.server 8899 # 然后访问 http://localhost:8899/tests/entity-editor.html
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 5. 使用方式
|
|
98
|
+
|
|
99
|
+
`EntityDesigner` 是 Entity / Relation 之上的轻量应用层,负责把建模交互闭环串起来:
|
|
100
|
+
|
|
101
|
+
```js
|
|
102
|
+
import { ICE, EntityDesigner } from 'ice-entity-designer';
|
|
103
|
+
|
|
104
|
+
const ice = new ICE().init('canvas-1');
|
|
105
|
+
const designer = new EntityDesigner(ice);
|
|
106
|
+
|
|
107
|
+
// 建模:创建实体与关系
|
|
108
|
+
const user = designer.createEntity({ entityName: 'User' });
|
|
109
|
+
const role = designer.createEntity({ entityName: 'Role' });
|
|
110
|
+
designer.createRelation({
|
|
111
|
+
sourceId: user.state.id,
|
|
112
|
+
targetId: role.state.id,
|
|
113
|
+
relationType: 'many-to-many',
|
|
114
|
+
joinTableName: 'user_roles',
|
|
115
|
+
linkShape: 'bezier', // 连线形态:'visio'(默认,正交折线)| 'bezier'(贝塞尔曲线)
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// 导出与校验
|
|
119
|
+
const schema = designer.toSchemaObject(); // TypeORM Schema(对象)
|
|
120
|
+
const schemaText = designer.toSchemaString(); // TypeORM Schema(JSON 字符串)
|
|
121
|
+
const issues = designer.validate(); // 校验问题列表
|
|
122
|
+
|
|
123
|
+
// 项目存取与历史
|
|
124
|
+
const snapshot = designer.serializeProject();
|
|
125
|
+
const report = designer.loadProject(snapshot); // 非法 / 版本不兼容的快照会抛错,且不会改动当前项目与历史栈
|
|
126
|
+
// report = { loaded, entities, relations, unknownTypes, skipped }
|
|
127
|
+
designer.undo();
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### 5.1 项目快照契约
|
|
131
|
+
|
|
132
|
+
- 快照带 `schemaVersion`(当前 `1`)与每个节点的 `typeId`;载入时**按 `typeId` 分派构造函数**(走 ICE 注册表,下游 `ice.registerType()` 注册的领域图元同样可载入)。旧快照没有 `typeId` 时,按所在数组归位(`entities[]` → `Entity`,`relations[]` → `Relation`)。
|
|
133
|
+
- **容错加载**:遇到未注册的 `typeId` 只跳过该节点并记录(`report.unknownTypes` / `report.skipped`),不会让整份数据打不开——与引擎 `Deserializer` 的语义一致。
|
|
134
|
+
- **自洽保证**:`serializeProject()` 的产物永远能通过 `loadProject()` 的结构校验(结构契约见 `src/utils/project-snapshot.schema.json`);载入失败时当前项目与 `undo`/`redo` 栈都不会被改动。
|
|
135
|
+
|
|
136
|
+
也支持更底层的组件式用法:
|
|
137
|
+
|
|
138
|
+
```js
|
|
139
|
+
const schema = IED.toSchemaObject(ice.childNodes);
|
|
140
|
+
const schemaText = IED.toSchemaString(ice.childNodes);
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
导出的对象可直接构造 TypeORM 实体:
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
import { EntitySchema } from 'typeorm';
|
|
147
|
+
|
|
148
|
+
const schemas = designer.toSchemaObject().map((obj) => new EntitySchema(obj));
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## 6. 在 React 中使用
|
|
152
|
+
|
|
153
|
+
包内置 React 绑定(子路径导出 `ice-entity-designer/react`),不需要自己写 ref / effect 胶水代码。
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
npm install ice-entity-designer react react-dom
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
import { useRef } from 'react';
|
|
161
|
+
import { EntityDesignerCanvas, useEntityDesigner } from 'ice-entity-designer/react';
|
|
162
|
+
import type { EntityDesignerHandle } from 'ice-entity-designer/react';
|
|
163
|
+
|
|
164
|
+
// 子树内可以取到同一个 EntityDesigner 实例
|
|
165
|
+
function Stats() {
|
|
166
|
+
const designer = useEntityDesigner();
|
|
167
|
+
return <span>{designer ? `${designer.entities.length} 个实体` : '初始化中…'}</span>;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export default function App() {
|
|
171
|
+
const ref = useRef<EntityDesignerHandle>(null);
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
<>
|
|
175
|
+
<button onClick={() => ref.current?.addEntity({ entityName: 'User' })}>新增实体</button>
|
|
176
|
+
<button onClick={() => console.log(ref.current?.toSchemaString())}>导出 Schema</button>
|
|
177
|
+
|
|
178
|
+
<EntityDesignerCanvas
|
|
179
|
+
ref={ref}
|
|
180
|
+
width={1200}
|
|
181
|
+
height={800}
|
|
182
|
+
defaultValue={initialProjectJson} // 可选:初始项目快照
|
|
183
|
+
onChange={({ snapshot, schema }) => save(snapshot)} // 模型变更
|
|
184
|
+
>
|
|
185
|
+
<Stats />
|
|
186
|
+
</EntityDesignerCanvas>
|
|
187
|
+
</>
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### 6.1 取用实例的两种方式
|
|
193
|
+
|
|
194
|
+
- **`ref`**:命令式 API —— `addEntity` / `connect` / `updateEntity` / `updateRelation` / `remove` / `loadProject` / `undo` / `redo` / `toSchemaObject` / `toSchemaString` / `validate` / `serializeProject`。
|
|
195
|
+
- **`useEntityDesigner()`**:在 `<EntityDesignerCanvas>` 子树内直接取到底层 `EntityDesigner` 实例(如上例的 `Stats`)。
|
|
196
|
+
|
|
197
|
+
### 6.2 组件属性
|
|
198
|
+
|
|
199
|
+
| 属性 | 类型 | 说明 |
|
|
200
|
+
|---|---|---|
|
|
201
|
+
| `value` | `string` | **受控**:项目快照,变化时同步进画布(内部变更经 `onChange` 上报,带循环保护) |
|
|
202
|
+
| `defaultValue` | `string` | **非受控**:初始项目快照 |
|
|
203
|
+
| `onChange` | `(payload: { snapshot, schema }) => void` | 模型变更(增删改 / 载入 / undo / redo)后触发,`snapshot` 可直接用于自动保存 |
|
|
204
|
+
| `onError` | `(payload: { phase, snapshot, error }) => void` | 快照载入失败(非法 / 版本不兼容)时触发,默认 `console.error`;组件内部已捕获,不会把异常抛进渲染树 |
|
|
205
|
+
| `onReady` | `(handle) => void` | 实例就绪,回调里拿到命令式句柄 |
|
|
206
|
+
| `width` / `height` | `number` | 画布尺寸,默认 `1200 × 800` |
|
|
207
|
+
| `renderMode` | `'dirty-rect' \| 'full'` | 渲染模式,默认 `dirty-rect` |
|
|
208
|
+
| `style` / `className` | — | 作用于画布容器 |
|
|
209
|
+
| `children` | `ReactNode` | 渲染在上下文内,可直接 `useEntityDesigner()` |
|
|
210
|
+
|
|
211
|
+
### 6.3 受控用法
|
|
212
|
+
|
|
213
|
+
```tsx
|
|
214
|
+
const [project, setProject] = useState(initialJson);
|
|
215
|
+
|
|
216
|
+
<EntityDesignerCanvas
|
|
217
|
+
value={project} // 外部改这个 → 同步进画布
|
|
218
|
+
onChange={({ snapshot }) => setProject(snapshot)} // 内部变更上报(同值回传不会重复载入,无回环)
|
|
219
|
+
width={1200}
|
|
220
|
+
height={800}
|
|
221
|
+
/>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 6.4 手动提供上下文
|
|
225
|
+
|
|
226
|
+
如果自己创建会话(例如画布在别处、只共享实例),用 `EntityDesignerProvider` 把实例交给任意子树:
|
|
227
|
+
|
|
228
|
+
```tsx
|
|
229
|
+
import { createDesignerSession, EntityDesignerProvider } from 'ice-entity-designer/react';
|
|
230
|
+
|
|
231
|
+
const session = createDesignerSession(canvasEl);
|
|
232
|
+
// <EntityDesignerProvider designer={session.designer}><Toolbar /></EntityDesignerProvider>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 6.5 注意事项
|
|
236
|
+
|
|
237
|
+
- **生命周期 / StrictMode**:`<EntityDesignerCanvas>` 挂载时创建 ICE + EntityDesigner,卸载时销毁。引擎侧 `init` 幂等、`destroy` 会解绑全局监听与帧循环,因此 **React StrictMode 双挂载安全**。
|
|
238
|
+
- **仅客户端渲染**:组件依赖 canvas,SSR(如 Next.js)请按客户端组件使用,例如 `dynamic(() => import('./Designer'), { ssr: false })`。
|
|
239
|
+
- React 是**可选 peerDependency**(`^18 || ^19`),不使用 React 的项目不受影响。
|
|
240
|
+
- **子路径解析**:现代解析器(webpack 5 / Vite / Node ESM)走 `exports`;老版本 TypeScript(< 4.7,或 `moduleResolution: "node"`)建议改用 `node16` / `bundler`,包内另提供 `react.d.ts` 垫片以兼容旧解析器。
|
|
241
|
+
|
|
242
|
+
> 完整可运行示例(**独立工程**,webpack 构建):[`ice-entity-designer-react-demo`](../ice-entity-designer-react-demo)
|
|
243
|
+
|
|
244
|
+
## 7. 项目结构
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
src/
|
|
248
|
+
├── designer/EntityDesigner.ts # 应用层:选择 / 增删改 / 连接 / 校验 / 历史 / 项目存取 / 变更订阅
|
|
249
|
+
├── er-component/
|
|
250
|
+
│ ├── Entity.ts # 实体:表头 + 字段列表 + 约束标记 + TypeORM 序列化
|
|
251
|
+
│ └── Relation.ts # 关系:基数 / 箭头 / 标签语义 / 连接槽位
|
|
252
|
+
├── react/
|
|
253
|
+
│ ├── EntityDesignerCanvas.ts # React 组件:画布 + 生命周期 + 命令式句柄
|
|
254
|
+
│ ├── session.ts # 会话封装:创建 / 销毁 ICE + EntityDesigner
|
|
255
|
+
│ ├── context.ts # 上下文与 useEntityDesigner()
|
|
256
|
+
│ └── index.ts # 子路径导出 ice-entity-designer/react
|
|
257
|
+
├── utils/
|
|
258
|
+
│ ├── serialization_util.ts # 画布 → TypeORM Schema
|
|
259
|
+
│ ├── schema_validator.ts # 轻量 Schema 校验
|
|
260
|
+
│ ├── camelcase_util.ts # 命名转换
|
|
261
|
+
│ └── pluralize_util.ts # 复数化(多对多属性名)
|
|
262
|
+
└── index.ts # 对外导出(核心,不含 React)
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## 8. 开发与测试
|
|
266
|
+
|
|
267
|
+
| 命令 | 说明 |
|
|
268
|
+
|---|---|
|
|
269
|
+
| `npm start` | 监听模式构建(开发) |
|
|
270
|
+
| `npm run build` | 清理并完整构建(类型声明 + JS 产物) |
|
|
271
|
+
| `npm run types:check` | 仅做 TypeScript 类型检查 |
|
|
272
|
+
| `npm test` | 运行单元测试(Jest) |
|
|
273
|
+
| `npm run pretty` | Prettier 格式化源码 |
|
|
274
|
+
|
|
275
|
+
## 9. 环境要求与依赖
|
|
276
|
+
|
|
277
|
+
- Node.js >= 10.13.0,npm >= 6.4.1。
|
|
278
|
+
- **引擎内核 `ice-render` 已打包进产物**(构建时 inline),因此无需安装 `ice-render`:
|
|
279
|
+
- 运行时:`import { ICE, EntityDesigner } from 'ice-entity-designer'`,两者来自同一份内核;
|
|
280
|
+
- 类型:引擎的类型声明也已一并 vendor 进包并改写为相对引用,`skipLibCheck: false` 下同样可解析。
|
|
281
|
+
- 运行时依赖已全部内联(`lodash` 等),安装本包即可独立运行。
|
|
282
|
+
- React 绑定为**可选**对等依赖 `react` / `react-dom`(`^18 || ^19`),仅在使用 `ice-entity-designer/react` 时需要。
|
|
283
|
+
- 构建链:Rollup 2 + Babel 7 + TypeScript 4.6;测试框架:Jest。
|
|
284
|
+
|
|
285
|
+
## 10. License
|
|
286
|
+
|
|
287
|
+
[MIT licensed](./LICENSE).
|