@arronqzy/abuilder-vue 0.1.23 → 0.1.24

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/README.md CHANGED
@@ -46,9 +46,10 @@ createApp(App).use(Antd).mount("#app");
46
46
  | `nameSpace` | 隔离 IndexedDB;同一页多个 App 必须不同 | — |
47
47
  | `previewSearch` | 覆盖预览 URL 查询串 | 当前 `location.search` |
48
48
  | `preview` | `true` 为预览页 | `false` |
49
- | `initialWorkspace` | 完整工作区。空则空白画布,不会自动打开 IndexedDB 记录 | — |
49
+ | `initialWorkspace` | 完整工作区。空则空白画布,不会自动打开 IndexedDB 记录。传入且带 `id` 时默认同步写入 IndexedDB(本地已有更新的记录不会被旧数据覆盖),以便预览与「同步」可用 | — |
50
+ | `workspaceId` | 按 IndexedDB id 打开(不 remount)。与 `initialWorkspace` 同时存在时:首次优先完整记录;之后 id 变化从 IndexedDB 打开 | — |
50
51
 
51
- 顶栏可切换中文 / English(`abuilder.locale`)。
52
+ 顶栏可切换中文 / English(`abuilder.locale`)。可用 `ref` 拿到 `AbuilderViewHandle`(`openWorkspace` / `syncWorkspace` / `getCurrentWorkspace` 等)。
52
53
 
53
54
  ## 编辑和预览
54
55
 
@@ -61,78 +62,58 @@ createApp(App).use(Antd).mount("#app");
61
62
 
62
63
  ## 自己存工作区
63
64
 
64
- 不要读写编辑器内部 IndexedDB。订阅事件,把完整对象交给自己的后端:
65
+ 以自己的后端为准:订阅 `workspace:add` / `workspace:sync`(载荷含 `nameSpace`),把完整对象交给后端;打开时校验后再传 `initialWorkspace`(会默认同步进 IndexedDB)。也可用 `putWorkspaceProject` 在不挂载编辑器时预热本地库,或用 `openWorkspace` / `workspaceId` / `ref` 命令式打开。
65
66
 
66
67
  ```ts
67
68
  import {
68
69
  addEventSubscription,
69
70
  AbuilderEvents,
70
71
  parseWorkspaceData,
71
- createEmptyWorkspace,
72
- createWorkspaceProjectId,
73
- validateWorkspaceData,
72
+ putWorkspaceProject,
73
+ openWorkspace,
74
+ getCurrentWorkspace,
75
+ getPreviewSnapshot,
74
76
  type WorkspaceData,
75
77
  } from "@arronqzy/abuilder-vue";
76
78
 
77
- const syncSub = addEventSubscription(
79
+ addEventSubscription(
78
80
  AbuilderEvents.workspaceSync,
79
- async (workspace: WorkspaceData) => {
81
+ async (workspace) => {
80
82
  await saveToServer(workspace);
81
- }
83
+ },
84
+ { nameSpace: "my-app" }
82
85
  );
83
- syncSub.unsubscribe();
84
86
 
85
87
  const parsed = parseWorkspaceData(jsonFromBackend);
86
88
  if (parsed.ok && parsed.value) {
87
- // <App :initial-workspace="parsed.value" />
89
+ await putWorkspaceProject(parsed.value, "my-app");
90
+ // <App name-space="my-app" :workspace-id="parsed.value.id" />
88
91
  }
89
-
90
- createEmptyWorkspace({ name: "未命名", id: createWorkspaceProjectId() });
91
- validateWorkspaceData(workspace);
92
92
  ```
93
93
 
94
- | 事件 | 常量 | 何时触发 |
95
- |------|------|----------|
96
- | `workspace:add` | `AbuilderEvents.workspaceAdd` | 创建成功 |
97
- | `workspace:sync` | `AbuilderEvents.workspaceSync` | 同步成功 |
98
- | `workspace:delete` | `AbuilderEvents.workspaceDelete` | 删除工作区(界面删除,或调用 `deleteWorkspaceProject` / `clearWorkspaceProjects`),参数 `{ ids, nameSpace }` |
99
-
100
- `validate*` 只检查。`parseWorkspaceData` 会补齐 `id`、时间戳和空字段。只检查视图用 `validateViewData` / `parseViewData`;只检查蓝图用 `validateBlueprintData` / `parseBlueprintData`。
101
-
102
- `WorkspaceData` 字段与 React 版相同:`id`、`name`、`createdAt`、`updatedAt`、`panelState`、`blueprintDocument`、`blueprintMeta`、`productName`、`titleIconDataUrl`。
103
-
104
- ### 清理浏览器里的本地数据
105
-
106
- 编辑器把工作区、蓝图库、蓝图执行日志、接口集合四类数据存在 IndexedDB 里,按 `nameSpace` 隔离。以后端为准时,可以清理本地副本,避免堆积:
107
-
108
- | 数据 | 列出 / 读取 | 删除单条 | 清空 |
109
- |------|-------------|----------|------|
110
- | 工作区 | `listWorkspaceProjects` / `getWorkspaceProject` | `deleteWorkspaceProject` | `clearWorkspaceProjects` |
111
- | 蓝图库 | `listBlueprintLibrary` / `getBlueprintLibraryRecord` | `deleteBlueprintLibraryRecord` | `clearBlueprintLibrary` |
112
- | 蓝图执行日志 | `listExecutionRunRecords` / `getExecutionRunRecord` | `deleteExecutionRunRecord` | `clearAllExecutionRunRecords` |
113
- | 接口集合 | `listApiCollectionRecords` | `deleteApiCollection` | `clearApiCollections` |
94
+ | 事件 | 常量 | 说明 |
95
+ |------|------|------|
96
+ | `workspace:add` / `workspace:sync` | `workspaceAdd` / `workspaceSync` | 载荷为 `WorkspaceData & { nameSpace }` |
97
+ | `workspace:delete` | `workspaceDelete` | `{ ids, nameSpace }` |
98
+ | `blueprint-library:changed` | `blueprintLibraryChanged` | 蓝图库 put / delete / clear |
99
+ | `api-collection:changed` | `apiCollectionChanged` | 接口集合 put / delete / clear |
114
100
 
115
- ```ts
116
- import {
117
- listWorkspaceProjects,
118
- deleteWorkspaceProject,
119
- clearWorkspaceProjects,
120
- clearAbuilderStorage,
121
- } from "@arronqzy/abuilder-vue";
101
+ ### 本地数据完整 CRUD
122
102
 
123
- const items = await listWorkspaceProjects(nameSpace);
124
- await deleteWorkspaceProject(items[0].id, nameSpace);
125
- const removed = await clearWorkspaceProjects(nameSpace); // 返回删除数量
126
- const result = await clearAbuilderStorage(nameSpace); // { workspaces, blueprints, executionRuns, apiCollections }
127
- ```
103
+ | 数据 | Create / Update | Read | Delete |
104
+ |------|-----------------|------|--------|
105
+ | 工作区 | `putWorkspaceProject` / `upsertWorkspaceProject` | `list` / `get` | `delete` / `clear` |
106
+ | 蓝图库 | `putBlueprintLibraryRecord` | `list` / `get` | `delete` / `clear` |
107
+ | 执行日志 | `putExecutionRunRecord` | `list` / `get` | `delete` / `clear` / `purge*` / `trim*` |
108
+ | 接口集合 | `putApiCollection` / `upsertApiCollectionFromJson` | `list` | `delete` / `clear` |
128
109
 
129
- `nameSpace` 要和 `<App :name-space>` 一致。清空函数返回删除数量;`clearAbuilderStorage` 不动主题、字号等偏好设置。删除工作区或蓝图库后,已挂载的编辑器会自动刷新列表,删除工作区还会发出 `workspace:delete` 事件。执行日志可用 `purgeExecutionRunsOlderThan` / `trimExecutionRunRecordsToMax` 按时间或条数清理,保留策略用 `readExecutionLogSettings` / `writeExecutionLogSettings` 读写。
110
+ `clearAbuilderStorage(nameSpace)` 一次清空四类。`getPreviewSnapshot` 与 React 版同名。
130
111
 
131
112
  ## 和 React 版的差别
132
113
 
133
- - **没有** `getPreviewSnapshot`。要缩略图就自己截预览 DOM,不要假设有同名导出。
134
114
  - 组件是 Ant Design Vue,不是 `@arronqzy/ui`。
135
115
  - 本包以源码发布(`exports` 指向 `src/`),宿主需要能编译 Vue SFC。
116
+ - 存储 / 事件 / 命令式 API / `getPreviewSnapshot` 与 React 版对齐。
136
117
 
137
118
  本仓库演示:
138
119
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arronqzy/abuilder-vue",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "Abuilder Vue 3 可视化编辑器入口包",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -15,7 +15,7 @@
15
15
  "ant-design-vue": "^4.2.6",
16
16
  "vue": "^3.5.13",
17
17
  "@arronqzy/i18n": "0.1.17",
18
- "@arronqzy/vue-view": "0.1.24"
18
+ "@arronqzy/vue-view": "0.1.25"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "vue": "^3.4.0"
package/src/App.vue CHANGED
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { computed, watch } from "vue";
2
+ import { computed, ref, watch } from "vue";
3
3
  import { ConfigProvider, theme } from "ant-design-vue";
4
4
  import zhCN from "ant-design-vue/es/locale/zh_CN";
5
5
  import enUS from "ant-design-vue/es/locale/en_US";
@@ -7,6 +7,7 @@ import {
7
7
  VueViewPanel,
8
8
  VueViewOnlinePreview,
9
9
  parseOnlinePreviewSearchParams,
10
+ type AbuilderViewHandle,
10
11
  } from "@arronqzy/vue-view";
11
12
  import { provideI18n } from "@arronqzy/i18n/vue";
12
13
  import { isLocale, LOCALE_STORAGE_KEY } from "@arronqzy/i18n";
@@ -18,9 +19,28 @@ const props = withDefaults(defineProps<AbuilderVueAppProps>(), {
18
19
  defaultTheme: "dark",
19
20
  locale: null,
20
21
  nameSpace: null,
22
+ workspaceId: null,
21
23
  preview: false,
22
24
  });
23
25
 
26
+ const panelRef = ref<AbuilderViewHandle | null>(null);
27
+ defineExpose({
28
+ getNameSpace: () => panelRef.value?.getNameSpace() ?? props.nameSpace ?? null,
29
+ getCurrentWorkspace: () => panelRef.value?.getCurrentWorkspace() ?? null,
30
+ openWorkspace: (idOrRecord: Parameters<AbuilderViewHandle["openWorkspace"]>[0]) =>
31
+ panelRef.value?.openWorkspace(idOrRecord) ??
32
+ Promise.reject(new Error("Abuilder panel is not mounted")),
33
+ createWorkspace: () =>
34
+ panelRef.value?.createWorkspace() ??
35
+ Promise.reject(new Error("Abuilder panel is not mounted")),
36
+ saveWorkspace: () =>
37
+ panelRef.value?.saveWorkspace() ??
38
+ Promise.reject(new Error("Abuilder panel is not mounted")),
39
+ syncWorkspace: () =>
40
+ panelRef.value?.syncWorkspace() ??
41
+ Promise.reject(new Error("Abuilder panel is not mounted")),
42
+ } satisfies AbuilderViewHandle);
43
+
24
44
  const localeStorageKey = (() => {
25
45
  const ns = (props.nameSpace ?? "").trim();
26
46
  return ns ? `${LOCALE_STORAGE_KEY}__${ns.slice(0, 120)}` : LOCALE_STORAGE_KEY;
@@ -72,10 +92,12 @@ const antdLocale = computed(() =>
72
92
  />
73
93
  <VueViewPanel
74
94
  v-else
95
+ ref="panelRef"
75
96
  :class="props.class"
76
97
  :initial-zoom="props.initialZoom"
77
98
  :name-space="props.nameSpace"
78
99
  :initial-workspace="props.initialWorkspace"
100
+ :workspace-id="props.workspaceId"
79
101
  :package-name="ABUILDER_VUE_PACKAGE_NAME"
80
102
  :package-version="ABUILDER_VUE_VERSION"
81
103
  />
package/src/index.ts CHANGED
@@ -17,14 +17,18 @@ export {
17
17
  createWorkspaceProjectId,
18
18
  listWorkspaceProjects,
19
19
  getWorkspaceProject,
20
+ putWorkspaceProject,
21
+ upsertWorkspaceProject,
20
22
  deleteWorkspaceProject,
21
23
  clearWorkspaceProjects,
22
24
  listBlueprintLibrary,
23
25
  getBlueprintLibraryRecord,
26
+ putBlueprintLibraryRecord,
24
27
  deleteBlueprintLibraryRecord,
25
28
  clearBlueprintLibrary,
26
29
  listExecutionRunRecords,
27
30
  getExecutionRunRecord,
31
+ putExecutionRunRecord,
28
32
  deleteExecutionRunRecord,
29
33
  clearAllExecutionRunRecords,
30
34
  purgeExecutionRunsOlderThan,
@@ -32,9 +36,17 @@ export {
32
36
  readExecutionLogSettings,
33
37
  writeExecutionLogSettings,
34
38
  listApiCollectionRecords,
39
+ putApiCollection,
40
+ upsertApiCollectionFromJson,
35
41
  deleteApiCollection,
36
42
  clearApiCollections,
37
43
  clearAbuilderStorage,
44
+ getCurrentWorkspace,
45
+ openWorkspace,
46
+ createWorkspace,
47
+ saveWorkspace,
48
+ syncWorkspace,
49
+ getPreviewSnapshot,
38
50
  addEventSubscription,
39
51
  AbuilderEvents,
40
52
  } from "@arronqzy/vue-view";
@@ -42,18 +54,26 @@ export type {
42
54
  ParseCheckResult,
43
55
  WorkspaceParseCheckResult,
44
56
  WorkspaceProjectListItem,
57
+ PutWorkspaceProjectOptions,
45
58
  AbuilderStorageClearResult,
46
59
  BlueprintLibraryListItem,
47
60
  BlueprintLibraryRecord,
48
61
  ExecutionRunRecord,
49
62
  ExecutionLogSettings,
50
63
  ApiCollectionRecord,
64
+ UpsertApiCollectionInput,
65
+ UpsertApiCollectionResult,
66
+ AbuilderViewHandle,
51
67
  AbuilderEventName,
52
68
  AbuilderEventPayloadMap,
69
+ AddEventSubscriptionOptions,
53
70
  WorkspaceAddEventPayload,
54
71
  WorkspaceSyncEventPayload,
55
72
  WorkspaceDeleteEventPayload,
73
+ BlueprintLibraryChangedEventPayload,
56
74
  ApiCollectionUploadStartEventPayload,
57
75
  ApiCollectionUploadSuccessEventPayload,
76
+ ApiCollectionChangedEventPayload,
58
77
  WorkspaceData,
78
+ GetPreviewSnapshotOptions,
59
79
  } from "@arronqzy/vue-view";
package/src/types.ts CHANGED
@@ -24,5 +24,10 @@ export type AbuilderVueAppProps = {
24
24
  * 外部传入的完整工作区。省略或空则首次渲染空画布 / 空蓝图,不会自动打开 IndexedDB 中的记录。
25
25
  */
26
26
  initialWorkspace?: WorkspaceProjectRecord | null;
27
+ /**
28
+ * 按 IndexedDB id 打开工作区(不 remount)。
29
+ * 与 `initialWorkspace` 同时存在时:首次优先完整记录;之后 id 变化从 IndexedDB 打开。
30
+ */
31
+ workspaceId?: string | null;
27
32
  };
28
33