Skip to content

快速上手

本指南帮助你在 5 分钟内跑通 Designer(设计器)和 Viewer(预览器)。

环境要求

  • Node.js >= 18
  • pnpm >= 9

安装

大多数场景只需安装面向应用的两个包(完整包列表见 包概览):

bash
# 设计器(包含完整的编辑工作台)
pnpm add @easyink/designer

# 预览器(独立的渲染/打印/导出引擎)
pnpm add @easyink/viewer

使用 Designer

Designer 是一个 Vue 3 组件,通过 v-model:schema 双向绑定文档模板。

vue
<script setup lang="ts">
import { ref } from 'vue'
import { EasyInkDesigner, createLocalStoragePreferenceProvider } from '@easyink/designer'
import { zhCN } from '@easyink/designer/locale'
import '@easyink/designer/index.css'

// 文档模板 -- 设计器的唯一数据源
const schema = ref({
  version: 1,
  mode: 'fixed',
  pages: [{
    width: 210,
    height: 297,
    unit: 'mm',
    elements: [],
  }],
})

// 偏好持久化(可选,保存面板布局、缩放等用户偏好)
const preferenceProvider = createLocalStoragePreferenceProvider()
</script>

<template>
  <EasyInkDesigner
    v-model:schema="schema"
    :locale="zhCN"
    :preference-provider="preferenceProvider"
  />
</template>

设计器内置 zhCNenUS 两套语言包,按需传给 locale 即可。

添加数据源

数据源定义了可绑定的字段树,用户可以通过拖拽将字段绑定到元素上。

ts
import type { DataSourceDescriptor } from '@easyink/designer'

const dataSources: DataSourceDescriptor[] = [{
  id: 'order',
  name: '订单数据',
  fields: [
    { path: 'orderNo', label: '订单号', type: 'text' },
    { path: 'customerName', label: '客户名称', type: 'text' },
    { path: 'qrcode', label: '二维码', type: 'image' },
  ],
}]
vue
<EasyInkDesigner
  v-model:schema="schema"
  :data-sources="dataSources"
  :locale="zhCN"
  :preference-provider="preferenceProvider"
/>

自动保存

配置 auto-save 属性,设计器会在 Schema 变化后自动调用你的保存回调。

ts
const autoSaveOptions = {
  enabled: true,
  delay: 1000, // 防抖延迟(毫秒)
  save: async (schemaSnapshot) => {
    // 保存到你的后端
    await fetch('/api/templates/1', {
      method: 'PUT',
      body: JSON.stringify({ schema: schemaSnapshot }),
    })
  },
}

使用 Viewer

Viewer 是一个命令式 API,通过 createViewer() 创建运行时实例。通常运行在 iframe 中以实现样式隔离。

vue
<script setup lang="ts">
import { createIframeViewerHost, createViewer } from '@easyink/viewer'
import { onBeforeUnmount, onMounted, ref } from 'vue'

const props = defineProps({
  schema: { type: Object, required: true },
  data: { type: Object, default: () => ({}) },
})

const iframeRef = ref()
let viewer

onMounted(async () => {
  // 1. 创建 iframe host
  const host = createIframeViewerHost(iframeRef.value)

  // 2. 创建 viewer 运行时
  viewer = createViewer({ host })

  // 3. 打开文档(传入 Schema + 数据)
  await viewer.open({
    schema: props.schema,
    data: props.data,
  })
})

onBeforeUnmount(() => {
  viewer?.destroy()
})
</script>

<template>
  <iframe ref="iframeRef" style="width: 100%; height: 100%; border: none;" />
</template>

打印与导出

Viewer 内置浏览器打印支持,同时支持注册自定义打印驱动和导出插件。

ts
// 浏览器打印
await viewer.print({ driverId: 'browser' })

// 导出 PDF(需要注册导出插件)
const blob = await viewer.exportDocument({
  format: 'pdf',
  entry: 'preview',
  onProgress: (progress) => console.log(progress),
})

下一步