@jieyin/editor-sdk 1.1.120 → 1.1.122
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 +386 -3
- package/dist/editor-sdk.es.js +5151 -5087
- package/dist/renderWorker.js +900 -898
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @jieyin/editor-sdk 使用文档
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
基于 Vue 3 + Fabric.js 的可视化设计编辑器 SDK,支持产品选型、刀版/变形模板、图层编辑、预览渲染与设计保存/还原。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 目录
|
|
8
|
+
|
|
9
|
+
- [安装与依赖](#安装与依赖)
|
|
10
|
+
- [快速开始](#快速开始)
|
|
11
|
+
- [Editor 组件](#editor-组件)
|
|
12
|
+
- [类型定义](#类型定义)
|
|
13
|
+
- [工具与服务](#工具与服务)
|
|
14
|
+
- [进阶:Composables](#进阶composables)
|
|
15
|
+
- [常见场景示例](#常见场景示例)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 安装与依赖
|
|
4
20
|
|
|
5
21
|
```bash
|
|
6
22
|
npm install @jieyin/editor-sdk
|
|
@@ -8,4 +24,371 @@ npm install @jieyin/editor-sdk
|
|
|
8
24
|
pnpm add @jieyin/editor-sdk
|
|
9
25
|
# 或
|
|
10
26
|
yarn add @jieyin/editor-sdk
|
|
11
|
-
```
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 对等依赖(需在业务项目中安装)
|
|
30
|
+
|
|
31
|
+
| 依赖 | 版本 |
|
|
32
|
+
| --- | ------ |
|
|
33
|
+
| vue | ^3.5.0 |
|
|
34
|
+
|
|
35
|
+
### 引入样式
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import '@jieyin/editor-sdk/style.css'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 快速开始
|
|
44
|
+
|
|
45
|
+
### 方式一:全局注册
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
// main.ts
|
|
49
|
+
import { createApp } from 'vue'
|
|
50
|
+
import App from './App.vue'
|
|
51
|
+
import { install } from '@jieyin/editor-sdk'
|
|
52
|
+
import '@jieyin/editor-sdk/style.css'
|
|
53
|
+
|
|
54
|
+
const app = createApp(App)
|
|
55
|
+
app.use(install)
|
|
56
|
+
app.mount('#app')
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```vue
|
|
60
|
+
<template>
|
|
61
|
+
<Editor
|
|
62
|
+
:product="product"
|
|
63
|
+
:basic-info="basicInfo"
|
|
64
|
+
:diecut-data="diecutData"
|
|
65
|
+
:deformation-data="deformationData"
|
|
66
|
+
:license-config="licenseConfig"
|
|
67
|
+
:file-token="fileToken"
|
|
68
|
+
@save-design="onSaveDesign"
|
|
69
|
+
/>
|
|
70
|
+
</template>
|
|
71
|
+
|
|
72
|
+
<script setup lang="ts">
|
|
73
|
+
import { ref } from 'vue'
|
|
74
|
+
import type { ProductItem, BasicInfo, DiecutResponse, DeformationResponse, LicenseConfig } from '@jieyin/editor-sdk'
|
|
75
|
+
|
|
76
|
+
const product = ref<ProductItem | null>(null)
|
|
77
|
+
const basicInfo = ref<BasicInfo | null>(null)
|
|
78
|
+
const diecutData = ref<DiecutResponse | null>(null)
|
|
79
|
+
const deformationData = ref<DeformationResponse | null>(null)
|
|
80
|
+
const fileToken = ref<string | null>(null)
|
|
81
|
+
const licenseConfig: LicenseConfig = {
|
|
82
|
+
licenseKey: 'YOUR_LICENSE_KEY',
|
|
83
|
+
apiBaseUrl: 'https://your-license-api.com'
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function onSaveDesign() {
|
|
87
|
+
// 调用业务保存接口
|
|
88
|
+
}
|
|
89
|
+
</script>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 方式二:按需引入组件
|
|
93
|
+
|
|
94
|
+
```vue
|
|
95
|
+
<template>
|
|
96
|
+
<Editor
|
|
97
|
+
:product="product"
|
|
98
|
+
:basic-info="basicInfo"
|
|
99
|
+
:diecut-data="diecutData"
|
|
100
|
+
:deformation-data="deformationData"
|
|
101
|
+
:options="{ showTopbar: true, showSidebar: true, showPreview: true }"
|
|
102
|
+
:license-config="licenseConfig"
|
|
103
|
+
:file-token="fileToken"
|
|
104
|
+
:on-save-design="onSaveDesign"
|
|
105
|
+
:on-object-modified="onObjectModified"
|
|
106
|
+
/>
|
|
107
|
+
</template>
|
|
108
|
+
|
|
109
|
+
<script setup lang="ts">
|
|
110
|
+
import { Editor, type LicenseConfig, type ProductItem, type BasicInfo, type DiecutResponse, type DeformationResponse } from '@jieyin/editor-sdk'
|
|
111
|
+
import '@jieyin/editor-sdk/style.css'
|
|
112
|
+
|
|
113
|
+
// ... 同上
|
|
114
|
+
</script>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Editor 组件
|
|
120
|
+
|
|
121
|
+
### Props
|
|
122
|
+
|
|
123
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
124
|
+
| ------------------------ | ------------------------------------------------------------ | ------ | ------------------------------------------- |
|
|
125
|
+
| `product` | `ProductItem \| null` | `null` | 当前选中的产品(单产品模式直接传入) |
|
|
126
|
+
| `basicInfo` | `BasicInfo \| null` | `null` | 产品基础信息(名称、尺码、颜色等) |
|
|
127
|
+
| `diecutData` | `DiecutResponse \| null` | `null` | 刀版数据(含 jsonURL、resources 等) |
|
|
128
|
+
| `deformationData` | `DeformationResponse \| null` | `null` | 变形/模板数据 |
|
|
129
|
+
| `options` | `EditorOptions` | 见下 | 界面与行为配置 |
|
|
130
|
+
| `productListApi` | `ProductListApi` | - | 产品列表接口(列表模式必传) |
|
|
131
|
+
| `productDetailApi` | `ProductDetailApi` | - | 产品详情接口(列表模式必传) |
|
|
132
|
+
| `productListPageSize` | `number` | - | 产品列表每页条数 |
|
|
133
|
+
| `productListInitialPage` | `number` | - | 产品列表初始页码 |
|
|
134
|
+
| `initialProductId` | `string \| number` | - | 进入时默认选中的产品 ID(需在第一页列表中) |
|
|
135
|
+
| `fileBaseUrl` | `string` | - | 文件资源基础 URL(用于代理/拼接) |
|
|
136
|
+
| `licenseConfig` | `LicenseConfig` | - | License 配置(不传则不做 License 校验) |
|
|
137
|
+
| `fileToken` | `string \| null` | `null` | 文件访问 Token(用于带鉴权的图片/资源) |
|
|
138
|
+
| `onObjectModified` | `(getDiecutStateMap: () => Record<string, unknown>) => void` | - | 画布内容变更回调,可在此调用 `getDiecutStateMap()` 拿各刀版状态 |
|
|
139
|
+
| `onRenderAllTemplates` | `(renderMethod) => Promise<...>` | - | 自定义「渲染所有模板」逻辑(如上传到服务器) |
|
|
140
|
+
| `onSaveDesign` | `() => void \| Promise<void>` | - | 保存设计(传入则在 Topbar 显示保存按钮) |
|
|
141
|
+
| `onGoHome` | `() => void` | - | 返回首页(传入则在 Topbar 显示返回按钮) |
|
|
142
|
+
| `onTemplateReady` | `() => void` | - | 首次模板加载完成后调用(可用于从 completeJsonUrl 还原设计) |
|
|
143
|
+
|
|
144
|
+
#### EditorOptions
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
interface EditorOptions {
|
|
148
|
+
showTopbar?: boolean // 是否显示顶栏,默认 true
|
|
149
|
+
showSidebar?: boolean // 是否显示左侧栏,默认 true
|
|
150
|
+
showPreview?: boolean // 是否显示预览面板,默认 true
|
|
151
|
+
enableGrid?: boolean // 是否启用网格,默认 true
|
|
152
|
+
usePreviewEffect?: boolean // 是否使用预览效果组件,默认 true
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 暴露方法(ref 调用)
|
|
157
|
+
|
|
158
|
+
通过 `ref` 获取组件实例后,可调用以下方法:
|
|
159
|
+
|
|
160
|
+
| 方法 | 说明 |
|
|
161
|
+
| -------------------------------- | ------------------------------------------------------------------------------- |
|
|
162
|
+
| `renderAllTemplates()` | 渲染当前产品下所有模板,返回 `Promise<Array<{ index: number; bitmap: ImageBitmap \| null }>>` |
|
|
163
|
+
| `triggerRenderAllTemplates()` | 触发一次「渲染所有模板」(会走 `onRenderAllTemplates` 若已传) |
|
|
164
|
+
| `getDiecutStateMap()` | 获取当前各刀版画布状态 Map(用于保存设计) |
|
|
165
|
+
| `getCurrentProductName()` | 获取当前产品名称 |
|
|
166
|
+
| `loadCanvasJson(diecutId, json)` | 按刀版 ID 加载一份画布 JSON |
|
|
167
|
+
| `loadDesignStateMap(stateMap)` | 从「按 diecutId 分组」的状态 Map 还原整单设计 |
|
|
168
|
+
|
|
169
|
+
示例:
|
|
170
|
+
|
|
171
|
+
```vue
|
|
172
|
+
<template>
|
|
173
|
+
<Editor ref="editorRef" ... />
|
|
174
|
+
</template>
|
|
175
|
+
|
|
176
|
+
<script setup lang="ts">
|
|
177
|
+
import { ref } from 'vue'
|
|
178
|
+
import { Editor } from '@jieyin/editor-sdk'
|
|
179
|
+
|
|
180
|
+
const editorRef = ref<InstanceType<typeof Editor> | null>(null)
|
|
181
|
+
|
|
182
|
+
async function save() {
|
|
183
|
+
const stateMap = editorRef.value?.getDiecutStateMap?.()
|
|
184
|
+
const name = editorRef.value?.getCurrentProductName?.()
|
|
185
|
+
// 上传 stateMap、name 到后端...
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function restore(stateMap: Record<string, unknown>) {
|
|
189
|
+
editorRef.value?.loadDesignStateMap?.(stateMap)
|
|
190
|
+
}
|
|
191
|
+
</script>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 类型定义
|
|
197
|
+
|
|
198
|
+
从 `@jieyin/editor-sdk` 可导出以下常用类型(详见 `src/types.ts`):
|
|
199
|
+
|
|
200
|
+
- **产品与配置**:`ProductItem`、`BasicInfo`、`EditorOptions`、`EditorProps`、`LicenseConfig`
|
|
201
|
+
- **刀版与变形**:`DiecutResource`、`DiecutItem`、`DiecutResponse`、`DeformationInfo`、`DeformationGroup`、`DeformationResponse`、`DeformationSizeGroup`、`DeformationColorGroup`
|
|
202
|
+
- **接口约定**:`ProductListApi`、`ProductDetailApi`、`ProductListResult`、`ProductDetailResult`
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
import type {
|
|
206
|
+
ProductItem,
|
|
207
|
+
BasicInfo,
|
|
208
|
+
DiecutResponse,
|
|
209
|
+
DeformationResponse,
|
|
210
|
+
EditorOptions,
|
|
211
|
+
LicenseConfig,
|
|
212
|
+
ProductListApi,
|
|
213
|
+
ProductDetailApi
|
|
214
|
+
} from '@jieyin/editor-sdk'
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 工具与服务
|
|
220
|
+
|
|
221
|
+
### 文件 Token(fileToken)
|
|
222
|
+
|
|
223
|
+
用于带鉴权的文件 URL(如图片、刀版资源)。支持「外部注入」或「内部拉取 + 自动附加」。
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
import {
|
|
227
|
+
setExternalFileToken,
|
|
228
|
+
getFileToken,
|
|
229
|
+
clearFileToken,
|
|
230
|
+
ensureFileToken,
|
|
231
|
+
appendFileTokenToUrl,
|
|
232
|
+
appendFileTokenIfPresent,
|
|
233
|
+
withFileToken,
|
|
234
|
+
fetchWithFileToken,
|
|
235
|
+
setFileTokenFetchers,
|
|
236
|
+
isFileTokenExpired
|
|
237
|
+
} from '@jieyin/editor-sdk'
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
- **外部注入**:业务侧维护 Token,通过 `setExternalFileToken(token)` 注入;Editor 内部请求文件时会自动用该 Token 拼到 URL。
|
|
241
|
+
- **内部拉取**:`setFileTokenFetchers({ fetchFileToken, fetchFileTokenRefresh })` 后,`ensureFileToken()` / `fetchWithFileToken(url)` 会负责获取/刷新并附加 Token。
|
|
242
|
+
|
|
243
|
+
### License
|
|
244
|
+
|
|
245
|
+
```ts
|
|
246
|
+
import {
|
|
247
|
+
LicenseAPI,
|
|
248
|
+
LicenseManager,
|
|
249
|
+
setLicenseInfo,
|
|
250
|
+
getLicenseInfo,
|
|
251
|
+
clearLicenseInfo,
|
|
252
|
+
TokenRefresher,
|
|
253
|
+
withRetry
|
|
254
|
+
} from '@jieyin/editor-sdk'
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
- 在 Editor 上通过 `licenseConfig` 传入即可完成校验与刷新;也可在非 Editor 场景下单独使用 `LicenseManager` / `LicenseAPI`。
|
|
258
|
+
|
|
259
|
+
### 渲染服务(renderService)
|
|
260
|
+
|
|
261
|
+
用于按 JSON 渲染位图、蒙版、混合等(多用于预览与导出):
|
|
262
|
+
|
|
263
|
+
```ts
|
|
264
|
+
import type { IRenderByJson } from '@jieyin/editor-sdk'
|
|
265
|
+
// 以及 renderService 下具体方法按需使用
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 进阶:Composables
|
|
271
|
+
|
|
272
|
+
Editor 内部由多个 composable 组成(产品数据、模板、刀版、画布、图层、工具状态等)。若你需要在自定义页面中复用某一块能力,可直接从 SDK 引入对应 composable(注:部分依赖 Editor 内部上下文,建议以「使用 Editor 组件」为主,按需再抽 composable)。
|
|
273
|
+
|
|
274
|
+
导出列表见 `sdk/src/components/Editor/composables/index.ts`,例如:
|
|
275
|
+
|
|
276
|
+
- `useLicense`、`useProductData`、`useToolState`、`useTemplateManager`
|
|
277
|
+
- `useCanvasManager`、`useLayerManager`、`useDiecutManager`
|
|
278
|
+
- `useImageHandler`、`useTextHandler`、`useLayerOperations`、`useObjectAdder`
|
|
279
|
+
- `usePreviewManager`、`usePreviewRenderer`、`usePreviewUpdateQueue`
|
|
280
|
+
- `useTemplateLoader`、`useCanvasStateByDiecut`、`useCanvasViewport`
|
|
281
|
+
- `useEditorWatchers`、`useCopyToDiecuts`、`useClearCanvas`、`useEditorReset`、`useDownloadPng`
|
|
282
|
+
- 以及相关类型:`TemplateItem`、`Layer`、`DiecutOption`、`UseTemplateLoaderOptions` 等
|
|
283
|
+
|
|
284
|
+
更细的 composable 说明见:`sdk/src/components/Editor/README.md`。
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 常见场景示例
|
|
289
|
+
|
|
290
|
+
### 单产品模式(直接传产品与详情数据)
|
|
291
|
+
|
|
292
|
+
```vue
|
|
293
|
+
<Editor
|
|
294
|
+
:product="product"
|
|
295
|
+
:basic-info="basicInfo"
|
|
296
|
+
:diecut-data="diecutData"
|
|
297
|
+
:deformation-data="deformationData"
|
|
298
|
+
:file-token="fileToken"
|
|
299
|
+
:license-config="licenseConfig"
|
|
300
|
+
:on-save-design="onSaveDesign"
|
|
301
|
+
/>
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
数据由业务侧请求产品详情接口得到后,赋给 `basicInfo`、`diecutData`、`deformationData` 即可。
|
|
305
|
+
|
|
306
|
+
### 产品列表模式(分页 + 选产品拉详情)
|
|
307
|
+
|
|
308
|
+
```vue
|
|
309
|
+
<Editor
|
|
310
|
+
:product-list-api="productListApi"
|
|
311
|
+
:product-detail-api="productDetailApi"
|
|
312
|
+
:product-list-page-size="12"
|
|
313
|
+
:product-list-initial-page="1"
|
|
314
|
+
:initial-product-id="initialProductId"
|
|
315
|
+
:file-token="fileToken"
|
|
316
|
+
:license-config="licenseConfig"
|
|
317
|
+
:on-save-design="onSaveDesign"
|
|
318
|
+
/>
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
- `productListApi(page, pageSize)` 返回 `{ rows: ProductItem[], total?: number }`
|
|
322
|
+
- `productDetailApi(productId)` 返回 `{ basicInfo, diecutData, deformationData }`
|
|
323
|
+
- `initialProductId` 若落在第一页列表中,进入后会默认选中该产品。
|
|
324
|
+
|
|
325
|
+
### 保存设计(拿状态 Map + 调用业务接口)
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
const editorRef = ref<InstanceType<typeof Editor> | null>(null)
|
|
329
|
+
|
|
330
|
+
async function onSaveDesign() {
|
|
331
|
+
const stateMap = editorRef.value?.getDiecutStateMap?.()
|
|
332
|
+
const productName = editorRef.value?.getCurrentProductName?.()
|
|
333
|
+
if (!stateMap) return
|
|
334
|
+
await saveDesignTask({ productName, stateMap })
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### 从已保存设计还原(如编辑我的设计)
|
|
339
|
+
|
|
340
|
+
1. 拉取设计详情,拿到 `completeJsonUrl` 或按刀版分组的 `stateMap`。
|
|
341
|
+
|
|
342
|
+
2. 若用 `stateMap`:先让 Editor 完成模板加载(产品、刀版、变形数据就绪),在 `onTemplateReady` 中调用:
|
|
343
|
+
|
|
344
|
+
```ts
|
|
345
|
+
editorRef.value?.loadDesignStateMap?.(stateMap)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
3. 若用 `completeJsonUrl`:在 `onTemplateReady` 中 fetch 该 JSON,按你与后端的约定解析成 `stateMap` 再调用 `loadDesignStateMap(stateMap)`。
|
|
349
|
+
|
|
350
|
+
### License 配置
|
|
351
|
+
|
|
352
|
+
```ts
|
|
353
|
+
const licenseConfig: LicenseConfig = {
|
|
354
|
+
licenseKey: 'YOUR_LICENSE_KEY',
|
|
355
|
+
apiBaseUrl: 'https://your-license-api.com',
|
|
356
|
+
timeout: 10000,
|
|
357
|
+
enableAutoRefresh: true,
|
|
358
|
+
refreshThreshold: 0.3,
|
|
359
|
+
onError: (err) => console.error('License Error:', err),
|
|
360
|
+
onSuccess: () => console.log('License OK'),
|
|
361
|
+
onTokenRefresh: (token) => { /* 可选:同步到业务 */ }
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
不传 `licenseConfig` 时,Editor 不进行 License 校验,直接进入编辑界面。
|
|
366
|
+
|
|
367
|
+
### 文件 Token(外部注入,如登录后从业务接口拿)
|
|
368
|
+
|
|
369
|
+
```ts
|
|
370
|
+
const fileToken = ref<string | null>(null)
|
|
371
|
+
|
|
372
|
+
onMounted(async () => {
|
|
373
|
+
const res = await yourAuthApi.getFileToken()
|
|
374
|
+
fileToken.value = res.file_token
|
|
375
|
+
// 可选:同步给 SDK 内部使用
|
|
376
|
+
setExternalFileToken(res.file_token)
|
|
377
|
+
})
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
```vue
|
|
381
|
+
<Editor :file-token="fileToken" ... />
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
业务侧负责 Token 刷新时,保持 `fileToken` 或 `setExternalFileToken` 更新即可。
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 版本与构建
|
|
389
|
+
|
|
390
|
+
- 当前包名:`@jieyin/editor-sdk`,版本见 `package.json`。
|
|
391
|
+
- 构建:`npm run build`(会先执行 wasm 构建再打 SDK 包)。
|
|
392
|
+
- 产物:`dist/editor-sdk.es.js`、`dist/style.css`、`dist/index.d.ts`。
|
|
393
|
+
|
|
394
|
+
如有问题或需要定制,请联系维护团队。
|