# 证书编辑器
**Repository Path**: zjqspace/certificate-editor
## Basic Information
- **Project Name**: 证书编辑器
- **Description**: 一个功能强大的基于 Vue 3 的可视化证书编辑器,支持拖拽编辑、系统字段关联、模板管理、图片/二维码处理等功能。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-01-15
- **Last Updated**: 2026-01-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# z-certificate-editor
一个功能强大的基于 Vue 3 的可视化证书编辑器,支持拖拽编辑、系统字段关联、模板管理、图片/二维码处理等功能。
## 📦 安装
```bash
npm install z-certificate-editor
```
或使用 yarn:
```bash
yarn add z-certificate-editor
```
或使用 pnpm:
```bash
pnpm add z-certificate-editor
```
## 🚀 快速开始
### 基础使用
```vue
```
### 使用自定义系统字段
```vue
```
### 通过组件引用获取数据
```vue
```
### 配置服务器上传
```vue
```
## 📖 完整文档
以下是完整的项目文档和使用说明。
## ✨ 功能特性
### 核心功能
- 🎨 **可视化编辑**: 直观的拖拽式编辑界面,所见即所得
- 📝 **文本元素**: 支持短文本和长文本元素,丰富的格式化选项
- 🖼️ **图片元素**: 支持本地上传(服务器上传或Base64)、URL输入、关联系统字段(如用户头像)
- 🔲 **二维码元素**: 支持文本内容、图片上传(服务器上传或Base64)、URL输入、关联系统字段(如证书编号、身份证号)
- ☁️ **服务器上传**: 支持配置上传接口,所有图片上传可自动上传到服务器并获取网络URL
- 🎯 **系统字段关联**: 动态关联系统字段,实现证书内容的自动化填充
- ⚙️ **自定义系统字段**: 支持通过 props 传入自定义系统字段配置,灵活适配不同业务场景
- 📐 **精确定位**: 支持精确的位置(X、Y)和尺寸(宽度、高度)设置
- 🎨 **丰富的文本格式**: 字体大小、字体族、粗体、斜体、下划线、颜色、对齐方式、行高等
### 模板管理
- 📄 **预设模板**: 提供横版和竖版预设证书模板
- 🔄 **模板切换**: 支持横版/竖版模板快速切换
- 📤 **自定义模板**: 支持上传自定义背景图片(JPG、JPEG、PNG等格式,最大10MB),支持服务器上传
- 📏 **智能尺寸建议**: 根据模板类型(横版/竖版)自动推荐合适的尺寸
### 数据管理
- 📊 **字段数据管理**: 可视化编辑和预览字段数据
- 🔍 **字段分类**: 系统字段按类别组织(基本信息、考试信息、证书信息、日期信息等)
- 💾 **配置保存**: 一键保存证书配置(模板、元素、字段数据)到控制台
- 👁️ **实时预览**: 支持预览最终证书效果,自动替换字段占位符为实际数据
### 交互功能
- 🖱️ **拖拽移动**: 选中元素后可拖拽移动位置
- 🔄 **调整大小**: 选中元素后拖动四角控制点调整大小
- ✏️ **属性编辑**: 右侧属性面板实时编辑选中元素的各项属性
- 🗑️ **元素删除**: 支持删除不需要的元素
## 📁 项目结构
```
drawcert/
├── src/
│ ├── components/
│ │ ├── CertificateEditor.vue # 主编辑器组件(核心组件)
│ │ ├── DesignPanel.vue # 左侧设计面板(元素添加、模板管理)
│ │ ├── CanvasArea.vue # 中间画布区域(证书展示和编辑)
│ │ ├── PropertiesPanel.vue # 右侧属性编辑面板
│ │ ├── FieldDataPanel.vue # 字段数据管理面板
│ │ ├── FieldDialog.vue # 字段关联对话框
│ │ └── CertificatePreview.vue # 证书预览组件(模态框)
│ ├── utils/
│ │ ├── fieldManager.js # 系统字段管理和工具函数
│ │ ├── templateManager.js # 模板管理和工具函数
│ │ └── common.js # 公共工具函数(上传功能等)
│ ├── App.vue # 根组件
│ ├── main.js # 入口文件
│ └── style.css # 全局样式
├── index.html
├── package.json
├── vite.config.js
└── README.md
```
## 🚀 安装和运行
### 环境要求
- Node.js >= 22.21.0
- npm >= 11.6.2
### 安装依赖
```bash
npm install
```
### 开发模式
```bash
npm run dev
```
启动后访问 `http://localhost:3000`(或终端显示的地址)
### 构建生产版本
```bash
npm run build
```
构建产物将输出到 `dist` 目录
### 预览生产版本
```bash
npm run preview
```
## 📖 使用说明
### 自定义系统字段
`CertificateEditor` 组件支持通过 `systemFields` prop 传入自定义系统字段配置,实现灵活的字段管理。
#### 在项目中使用
```vue
```
#### 字段对象格式
每个系统字段对象必须包含以下属性:
- `key` (String, 必需): 字段的唯一标识符,用于在代码中引用
- `label` (String, 必需): 字段的显示名称,显示在界面上
- `placeholder` (String, 必需): 字段的占位符格式,如 `{{姓名}}`
- `category` (String, 可选): 字段的分类,用于分组显示
- `description` (String, 可选): 字段的描述信息
#### 注意事项
- 如果不传入 `systemFields` prop,组件将使用默认的 `SYSTEM_FIELDS`
- 自定义字段的 `key` 必须唯一,避免与默认字段冲突
- 字段的 `placeholder` 格式必须为 `{{字段名}}` 的形式
- 自定义字段会自动在字段选择对话框、属性面板等位置显示
### 基本操作流程
1. **选择模板**
- 点击左侧面板的"底图模板"标签
- 选择横版或竖版预设模板,或上传自定义背景图片
- 模板背景将自动铺满整个证书画布
2. **添加元素**
- 点击左侧面板的"设计元素"标签
- 选择要添加的元素类型:
- **短文本**: 适合标题、姓名等简短文本
- **长文本**: 适合描述、说明等较长文本
- **图片**: 支持上传图片或关联用户头像字段
- **二维码**: 支持文本内容或关联证书编号等字段
3. **编辑元素**
- 点击画布上的元素进行选择(选中后显示边框和控制点)
- 在右侧属性面板编辑元素的各种属性
- 可以拖拽移动元素位置
- 可以拖动四角控制点调整元素大小
4. **关联系统字段**
- 对于文本元素:点击内容输入框右侧的"+"按钮,打开字段关联对话框
- 选择要关联的系统字段,字段占位符将插入到文本中
- 在字段数据面板中编辑字段的实际值
5. **预览和保存**
- 点击顶部工具栏的"预览"按钮,查看最终证书效果
- 点击"保存"按钮,将当前配置保存到浏览器控制台
### 文本元素
#### 文本格式化选项
- **字体大小**: 从下拉菜单选择预设大小(12px - 72px)
- **字体**: 选择字体族(如:宋体、微软雅黑、Arial等)
- **样式**:
- 粗体 (B)
- 斜体 (I)
- 下划线 (U)
- **颜色**: 点击颜色选择器设置文字颜色
- **对齐**: 左对齐、居中、右对齐、两端对齐
- **行高**: 设置文本行高(1.0 - 3.0)
#### 字段关联
- 在文本内容中插入字段占位符,如:`{{姓名}}`、`{{考试名称}}`
- 系统会自动识别并高亮显示字段占位符
- 在字段数据面板中编辑字段的实际值
### 图片元素
#### 图片来源
1. **本地上传**
- 点击"本地上传"按钮选择本地图片文件
- 支持格式:JPG、JPEG、PNG、GIF、WEBP、SVG、BMP
- 文件大小限制:最大 2MB
- 如果配置了 `uploadConfig`,会上传到服务器并获取网络URL
- 如果未配置 `uploadConfig`,会自动转换为 Base64 格式
2. **URL输入**
- 在URL输入框中输入图片的网络地址
- 支持 http/https 协议的图片链接
- 支持协议相对URL(// 开头),会自动转换为完整URL
3. **关联字段**
- 选择关联的系统字段(如:头像、照片、头像图片)
- 系统会使用字段数据中的图片URL或Base64数据
#### 图片尺寸
- 可以自由设置图片的宽度和高度
- 支持像素(px)单位
### 二维码元素
#### 二维码内容来源
1. **本地上传**
- 点击"本地上传"按钮选择二维码图片
- 支持格式:JPG、JPEG、PNG、GIF、WEBP、SVG、BMP
- 文件大小限制:最大 2MB
- 如果配置了 `uploadConfig`,会上传到服务器并获取网络URL
- 如果未配置 `uploadConfig`,会自动转换为 Base64 格式
2. **URL/内容输入**
- 输入文本内容(将生成二维码)
- 输入图片URL(直接显示二维码图片)
- 支持协议相对URL(// 开头),会自动转换为完整URL
3. **关联字段**
- 选择关联的系统字段(如:证书编号、身份证号、链接地址、考试名称)
- 系统会使用字段数据中的内容生成二维码
#### 二维码尺寸
- 可以自由设置二维码的宽度和高度
- 支持像素(px)单位
### 模板管理
#### 预设模板
- 系统提供多套预设的横版和竖版证书模板
- 点击"底图模板"标签切换到模板管理
- 点击模板类型按钮("竖版"或"横版")筛选模板
- 点击模板卡片选择并应用模板
#### 自定义模板上传
1. 点击"上传自定义模板"按钮
2. 选择要上传的背景图片文件
3. 系统会根据当前选择的模板类型(横版/竖版)自动设置推荐尺寸
4. 如果配置了 `uploadConfig`,会上传到服务器并获取网络URL
5. 如果未配置 `uploadConfig`,会自动转换为 Base64 格式
6. 上传成功后,模板将自动应用
**上传要求**:
- 支持格式:JPG、JPEG、PNG、GIF、WEBP、SVG、BMP
- 文件大小:最大 2MB
- 建议尺寸:
- 竖版:972 x 1378 px 或相近比例
- 横版:1303 x 897 px 或相近比例
### 字段数据管理
- 在右侧面板底部的"字段数据"区域管理字段值
- 系统会根据证书中使用的字段自动显示相应的输入框
- 编辑字段值后,画布上的占位符会自动更新(预览模式)
### 服务器上传配置
组件支持配置上传接口,所有图片上传(模板背景、图片元素、二维码元素)都可以自动上传到服务器并获取网络URL。
#### 配置上传接口
```vue
```
#### 服务器返回格式
组件支持多种服务器返回格式,会自动识别并提取图片URL:
```javascript
// 格式1:直接返回 url 字段
{ "url": "http://example.com/image.jpg" }
// 格式2:嵌套在 data.file 中
{
"data": {
"file": {
"full_url": "http://example.com/image.jpg",
"url": "http://example.com/image.jpg"
}
}
}
// 格式3:嵌套在 data 中
{ "data": { "url": "http://example.com/image.jpg" } }
// 格式4:直接返回 URL 字符串
{ "data": "http://example.com/image.jpg" }
// 格式5:直接返回字符串
"http://example.com/image.jpg"
```
#### 兼容性说明
- 如果未配置 `uploadConfig` 或设置为 `null`,所有图片上传会自动使用 Base64 方式
- 保持向后兼容,不影响现有功能
- 支持协议相对URL(`//` 开头),会自动转换为完整URL
### 预览功能
- 点击顶部工具栏的"预览"按钮打开预览模态框
- 预览模式下,所有字段占位符会被替换为实际字段数据
- 预览的证书即为最终效果
### 保存功能
- 点击顶部工具栏的"保存"按钮
- 系统会将当前证书配置(模板、元素列表、字段数据)输出到浏览器控制台
- 同时触发 `save` 事件,将数据传递给父组件
- 父组件可以通过事件处理函数接收保存的数据
**保存的数据结构**:
```json
{
"template": {
"id": "template-id",
"name": "模板名称",
"background": "背景图片或颜色",
"width": 972,
"height": 1378
},
"elements": [
{
"id": 1234567890,
"type": "text",
"content": "{{姓名}}({{性别称呼}})",
"x": 100,
"y": 200,
"width": 300,
"fontSize": 24,
// ... 其他属性
}
],
"fieldData": {
"name": "张三",
"gender": "先生",
// ... 其他字段数据
},
"timestamp": "2024-01-01T00:00:00.000Z"
}
```
#### 在父组件中获取保存的数据
有两种方式可以在父组件中获取证书配置数据:
**方式一:通过事件监听(推荐)**
当用户点击保存按钮时,组件会触发 `save` 事件,父组件可以通过监听该事件获取数据:
```vue
```
**方式二:通过组件方法主动获取**
父组件可以通过组件引用调用 `getCertificateData()` 方法,随时获取当前的证书配置数据(无需点击保存按钮):
```vue
```
**完整示例**:
```vue
```
## 🧩 组件说明
### CertificateEditor
主编辑器组件,负责整体的状态管理和组件协调。
**功能**:
- 管理元素列表、选中元素、字段数据、当前模板
- 协调各子组件的通信
- 提供预览和保存功能
**Props**:
- `systemFields` (Array, 可选): 自定义系统字段配置数组
- 如果不传入,将使用默认的 `SYSTEM_FIELDS`
- 字段对象格式:
- `uploadConfig` (Object, 可选): 上传配置对象
- 如果配置了上传接口,所有图片上传都会请求服务器
- 配置格式:
```javascript
{
url: 'http://example.com/api/upload', // 上传接口地址(必需)
method: 'POST', // 请求方法,默认 'POST'
fileField: 'file', // 文件字段名,默认 'file'
params: {
// 额外的表单参数(可选)
type: 'image',
category: 'certificate'
},
headers: {
// 请求头(可选)
'Authorization': 'Bearer token',
'X-Custom-Header': 'value'
}
}
```
- 如果不配置或设置为 `null`,则使用 Base64 方式
- 服务器返回格式支持:
- `{ url: '...' }`
- `{ data: { file: { full_url: '...', url: '...' } } }`
- `{ data: { url: '...' } }`
- `{ data: '...' }`
- 直接返回 URL 字符串
```javascript
{
key: '字段唯一标识',
label: '字段显示名称',
placeholder: '{{占位符}}',
category: '字段分类',
description: '字段描述'
}
```
- 示例:
```javascript
const customFields = [
{
key: 'customField',
label: '自定义字段',
placeholder: '{{自定义字段}}',
category: '其他',
description: '这是一个自定义字段'
},
...SYSTEM_FIELDS // 可以结合默认字段使用
]
```
**Events**:
- `save`: 当用户点击保存按钮时触发
- 参数:`certificateData` (Object) - 证书配置数据对象
- 数据结构包含:`template`、`elements`、`fieldData`、`timestamp`
**Exposed Methods**:
- `getCertificateData()`: 获取当前证书配置数据
- 返回:`Object` - 证书配置数据对象
- 使用方式:通过组件引用调用 `certificateEditorRef.value.getCertificateData()`
### DesignPanel
左侧设计面板,提供元素添加和模板管理功能。
**功能**:
- 切换"设计元素"和"底图模板"标签
- 提供元素添加按钮(短文本、长文本、图片、二维码)
- 管理预设模板和自定义模板上传
**Events**:
- `add-element`: 添加新元素时触发,参数为元素类型
- `select-template`: 选择模板时触发,参数为模板对象
- `upload-template`: 上传模板时触发,参数为模板对象
### CanvasArea
中间画布区域,显示证书模板和可编辑元素。
**功能**:
- 渲染证书背景模板
- 渲染和交互所有元素(文本、图片、二维码)
- 处理元素的拖拽和调整大小
- 替换字段占位符为实际数据
**Props**:
- `elements`: Array - 元素列表
- `selectedElement`: Object | null - 当前选中的元素
- `fieldData`: Object - 字段数据对象
- `template`: Object - 当前选中的模板
- `systemFields`: Array - 系统字段配置数组(从 CertificateEditor 传递)
**Events**:
- `select-element`: 选择元素时触发
- `update-element`: 更新元素时触发
- `delete-element`: 删除元素时触发
### PropertiesPanel
右侧属性编辑面板,编辑选中元素的属性。
**功能**:
- 根据元素类型动态显示相应的编辑选项
- 提供文本格式化、图片设置、二维码设置等功能
- 实时更新元素属性
**Props**:
- `element`: Object - 当前选中的元素
- `systemFields`: Array - 系统字段配置数组(从 CertificateEditor 传递)
- `uploadConfig`: Object - 上传配置对象(从 CertificateEditor 传递)
**Events**:
- `update-element`: 更新元素时触发
### FieldDataPanel
字段数据管理面板,显示和编辑字段数据。
**功能**:
- 显示当前使用的系统字段
- 提供字段值的输入框
- 实时更新字段数据
**Props**:
- `fieldData`: Object - 字段数据对象
**Events**:
- `update-field-data`: 更新字段数据时触发
### FieldDialog
字段关联对话框,用于在文本中插入系统字段。
**功能**:
- 显示系统字段列表(按类别分组)
- 支持搜索字段
- 插入字段占位符到文本内容
**Props**:
- `visible`: Boolean - 对话框显示状态
- `currentText`: String - 当前文本内容
- `selectionStart`: Number - 文本选择起始位置
- `selectionEnd`: Number - 文本选择结束位置
- `systemFields`: Array - 系统字段配置数组(从 PropertiesPanel 传递)
### CertificatePreview
证书预览组件,以模态框形式显示最终证书效果。
**功能**:
- 渲染完整的证书预览
- 自动替换所有字段占位符为实际数据
- 支持关闭预览
**Props**:
- `visible`: Boolean - 预览对话框显示状态
- `elements`: Array - 元素列表
- `template`: Object - 当前选中的模板
- `fieldData`: Object - 字段数据对象
- `systemFields`: Array - 系统字段配置数组(从 CertificateEditor 传递)
## 🛠️ 技术栈
- **Vue 3**: 使用 Composition API 进行组件开发
- **Vite**: 快速的前端构建工具
- **原生 CSS**: 无第三方CSS框架,纯原生样式
- **Canvas/HTML**: 基于HTML和CSS的渲染,非Canvas绘制
## 🔌 API 参考
### CertificateEditor Props
| 属性名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `systemFields` | `Array` | `SYSTEM_FIELDS` | 自定义系统字段配置数组 |
| `uploadConfig` | `Object` | `null` | 上传配置对象,配置后所有图片上传会请求服务器 |
| `templates` | `Array` | `PRESET_TEMPLATES` | 自定义模板数组 |
| `initialData` | `Object` | `null` | 初始证书配置数据 |
### CertificateEditor Events
| 事件名 | 参数 | 说明 |
|--------|------|------|
| `save` | `certificateData: Object` | 当用户点击保存按钮时触发,传递证书配置数据 |
### CertificateEditor Exposed Methods
| 方法名 | 参数 | 返回值 | 说明 |
|--------|------|--------|------|
| `getCertificateData()` | - | `Object` | 获取当前证书配置数据,无需点击保存按钮 |
### 系统字段对象格式
```typescript
interface SystemField {
key: string // 字段唯一标识
label: string // 字段显示名称
placeholder: string // 占位符格式,如 "{{姓名}}"
category?: string // 字段分类(可选)
description?: string // 字段描述(可选)
}
```
### 证书配置数据格式
```typescript
interface CertificateData {
template: {
id: string
name: string
type: 'vertical' | 'horizontal'
background: string
width: number
height: number
}
elements: Array<{
id: number
type: 'text' | 'longtext' | 'image' | 'qrcode'
x: number
y: number
width: number
height?: number
content?: string
style?: object
imageSource?: 'url' | 'field'
imageUrl?: string
imageField?: string
qrcodeSource?: 'url' | 'field'
qrcodeContent?: string
qrcodeField?: string
}>
fieldData: Record
timestamp: string
}
```
## 📋 系统字段列表
系统内置了丰富的字段类型,按类别组织:
### 基本信息
- 姓名 (name)
- 性别称呼 (gender)
- 账号 (account)
### 考试信息
- 考试名称 (examName)
- 成绩 (score)
- 成绩等级 (scoreLevel)
- 考试分数 (examScore)
### 证书信息
- 证书编号 (certificateNumber)
- 有效期 (validityPeriod)
### 日期信息
- 签发日期 (issueDate)
- 签发日期-年 (issueDateYear)
- 签发日期-月 (issueDateMonth)
- 签发日期-日 (issueDateDay)
- 生效日期 (effectiveDate)
- 到期日期 (expiryDate)
### 其他信息
- 身份证号 (idNumber)
- 手机号 (phone)
- 邮箱 (email)
- 地址 (address)
- 机构名称 (organization)
- 链接地址 (url)
### 图片字段
- 头像 (avatar)
- 照片 (photo)
- 头像图片 (headImage)
## 🌐 浏览器支持
- ✅ Chrome (最新版)
- ✅ Firefox (最新版)
- ✅ Safari (最新版)
- ✅ Edge (最新版)
## 📝 开发计划
### 已完成功能 ✅
- [x] 可视化拖拽编辑
- [x] 文本元素(短文本、长文本)
- [x] 图片元素(本地上传、URL、关联字段)
- [x] 二维码元素(文本内容、URL、关联字段)
- [x] 服务器上传功能(支持配置上传接口)
- [x] 系统字段关联
- [x] 自定义系统字段支持(通过 props 传入)
- [x] 预设模板管理
- [x] 自定义模板上传
- [x] 字段数据管理
- [x] 预览功能
- [x] 配置保存功能
### 计划中功能 🚧
- [ ] 二维码生成(根据文本内容自动生成二维码图片)
- [ ] 撤销/重做功能
- [ ] 元素复制/粘贴
- [ ] 元素对齐辅助线
- [ ] 导出功能(PNG、PDF)
- [ ] 导入功能(导入保存的配置)
- [ ] 元素层级管理(置顶、置底、上移、下移)
- [ ] 批量操作(多选、批量移动、批量删除)
- [ ] 模板收藏和分类
- [ ] 响应式设计适配
## 📄 许可证
MIT
## 📝 版本历史
### 1.0.3
- 初始版本发布
- 支持可视化证书编辑
- 支持系统字段关联
- 支持模板管理
- 支持图片和二维码元素
- 支持保存和预览功能
- 支持自定义系统字段
- 支持通过事件和方法获取保存的数据
- 发布为 npm 包,支持 ES 模块和 UMD 格式
### 1.0.4+
- 新增服务器上传功能
- 支持配置上传接口(URL、请求方法、请求头、请求参数)
- 所有图片上传(模板、图片元素、二维码元素)都支持服务器上传
- 支持多种服务器返回格式
- 未配置上传接口时自动使用 Base64 方式(向后兼容)
- 支持协议相对URL(// 开头),自动转换为完整URL
- 优化图片和二维码显示逻辑
- 提取上传功能到公共工具函数(`utils/common.js`)
## 👨💻 开发说明
### 核心概念
1. **元素系统**: 所有可编辑的元素(文本、图片、二维码)都遵循统一的数据结构
2. **字段系统**: 使用占位符(如 `{{姓名}}`)实现动态内容替换
3. **模板系统**: 支持预设模板和自定义模板,背景自动铺满画布
4. **状态管理**: 使用 Vue 3 Composition API 的 `ref` 和 `reactive` 管理状态
### 代码规范
- 使用 Composition API
- 组件采用单文件组件(SFC)格式
- 使用语义化的CSS类名
- 保持组件的单一职责原则
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
## 📞 联系方式
如有问题或建议,请提交 Issue。