更新记录

0.6.3(2026-10-21) 下载此版本

首个版本发布:

  • JSON 模板驱动:6 类元素(文字/图片/色块/圆/线/二维码),渐变、旋转、阴影、自动换行
  • 5 套精设计模板一键切换,模板 + 数据分离(fields 占位符动态填充,服务端可下发)
  • 内嵌二维码:纯 JS 编码零依赖,真机可扫
  • 1:1 高清导出(背板按 schema.width × pixelRatio 渲染,零重采样)
  • 保存分流:H5 浏览器下载 / App·小程序存相册
  • 已验证 H5 与微信小程序(真机)

平台兼容性

uni-app(3.8.6)

Vue2 Vue2插件版本 Vue3 Vue3插件版本 Chrome Chrome插件版本 Safari Safari插件版本 app-vue app-vue插件版本 app-nvue Android iOS 鸿蒙
√ 0.6.3 √ 0.6.3 √ 0.6.3 √ 0.6.3 √ 0.6.3 - - - -
微信小程序 微信小程序插件版本 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ 0.6.3 - - - - - × - - - × ×

赢冬海报生成器 yingdong-poster

定位:与 canvas 海报类竞品(头部款 2020 年发布、累计 3929 下载、已停更多年)的差异点 在于声明式 JSON 模板——竞品把绘制逻辑写死在代码里,我们让海报变成一份数据: 改 JSON 即改海报,服务端可按用户动态下发模板实现"千人千面"活动页。 纯前端 canvas 实现,零外部依赖:无 key、无 CORS、无域名白名单问题。

特性

  • 支持 vue2 / vue3;H5、微信小程序、App(vue)
  • 声明式元素:rect / circle / line / text / image / qrcode(内嵌编码器,零依赖)
  • 视觉能力:线性渐变填充、透明度、旋转、阴影、自动换行(中文友好)、圆角裁切、aspectFill 裁切
  • 模板 + 数据分离:schema 挖 {{key}} 占位符 + fields 传值—— 开发定模板、运营填表单,终端用户无需理解 JSON;再往上可接可视化设计器
  • 图片自动预加载、加载失败占位
  • 2 倍像素导出高清 PNG(pixelRatio 可调),离屏背板 1:1 导出零重采样
  • schema / fields 变更自动重绘;ref API:render() / saveToAlbum()(H5 自动转浏览器下载)/ getPosterPath()
  • 组件为纯离屏输出,不渲染可见内容;监听 @success 拿临时图片路径自行展示
  • 模板 + 数据分离:schema 挖 {{key}} 占位符 + fields 传值—— 开发定模板、运营填表单,终端用户无需理解 JSON;再往上可接可视化设计器

快速上手

<template>
    <!-- 运营视图:只填表单,不碰 JSON -->
    <input v-model="fields.title" placeholder="主标题" />
    <yingdong-poster ref="poster" :schema="schema" :fields="fields" :display-width="340" @success="onSuccess" />
</template>

<script>
export default {
    data() {
        return {
            // 模板由开发者提前定好,占位符挖给运营填
            schema: {
                width: 750,
                height: 1334,
                background: '#0f172a',
                elements: [
                    { type: 'rect', x: 0, y: 0, width: 750, height: 420, fill: '#3b82f6' },
                    { type: 'text', x: 60, y: 110, text: '{{title}}', fontSize: 56, color: '#ffffff', fontWeight: 'bold' }
                ]
            },
            fields: { title: '夏日大促 全场五折' }
        }
    },
    methods: {
        onSuccess(tempFilePath) {
            console.log('海报已生成:', tempFilePath)
        }
    }
}
</script>

典型接入场景

场景 A:给页面加"生成海报"按钮(电商商品图 / 分享图)

不传 preview-width 时组件完全离屏,页面上只需要一个按钮:

<template>
    <button @click="make">生成分享海报</button>
    <image v-if="path" :src="path" mode="widthFix" />
    <yingdong-poster ref="poster" :schema="tpl" :fields="fields" @success="p => path = p" />
</template>
<script>
export default {
    data() {
        return {
            tpl: { /* 商品海报模板,可直接抄插件内置示例改配色文案 */ },
            // 商品数据运行时填入模板占位符
            fields: { title: '无线蓝牙耳机', price: '¥ 199', qrUrl: 'https://xx.com/p/1001' },
            path: ''
        }
    },
    methods: {
        make() { this.$refs.poster.render() }
    }
}
</script>

场景 B:分销邀请海报(每人专属二维码,模板存服务端)

模板 JSON 放在服务端,运营改模板无需发版;用户数据通过 fields 填入占位符,每个人的二维码都不同:

onLoad() {
    // 1. 服务端下发模板({ width, height, background, elements })
    uni.request({
        url: 'https://你的后端/api/poster-template?scene=invite',
        success: (res) => { this.tpl = res.data }
    })
    // 2. 用户数据填充 {{nickname}} / {{inviteUrl}} 占位符
    const user = uni.getStorageSync('userInfo')
    this.fields = {
        nickname: user.nickname,
        inviteUrl: 'https://xx.com/inv?code=' + user.inviteCode
    }
},
methods: {
    make() { this.$refs.poster.render() }   // 出图后 @success 拿路径,可存相册/分享
}

保存与分享

  • saveToAlbum():App/小程序存相册(自动处理授权提示),H5 触发浏览器下载
  • 拿到 @success 的临时路径后,也可以自行接 uni.share 或业务逻辑

Schema 说明

字段 类型 说明
width / height Number 设计稿尺寸(绘制坐标系基准)
background String 背景色
elements Array 元素列表,按顺序绘制(后者覆盖前者)

元素类型:

type 专有字段 说明
rect x,y,width,height,fill,radius,rotate,shadow 矩形/色块
circle cx,cy,r,fill 圆形装饰
line x1,y1,x2,y2,color,width 直线
text x,y,text,fontSize,color,fontWeight,lineHeight,maxWidth,align,rotate,shadow 文本,超出 maxWidth 自动换行,\n 强制换行
image x,y,width,height,src,radius,fill,rotate 图片,aspectFill 盖满裁切,失败画 fill 占位
qrcode x,y,width,content,color,bg,margin,radius,level 二维码,内嵌 MIT 开源库 qrcode-generator(打包进插件),版本 1-10 自动、纠错级默认 M,content 超长画占位块

fill 渐变(background/rect/circle 通用):

{ "type": "linear", "from": [0, 0], "to": [750, 1334], "stops": ["#4f46e5", "#db2777"] }

Props

属性 类型 默认值 说明
schema Object null 海报模板,变更自动重绘,字符串字段支持 {{key}} 占位符
fields Object null 占位符填充数据,变更自动重绘(给运营表单/服务端动态数据用)
displayWidth Number 340 画布显示宽度 px
pixelRatio Number 2 导出倍率

Events / Methods

名称 说明
@success 导出成功,参数 tempFilePath
@error schema 非法或导出失败
render() 手动触发重绘+导出(ref 调用)
saveToAlbum() 保存最近一次导出的海报到相册

维护说明

组件持续更新维护中,欢迎通过官方渠道反馈需求与建议—— 你的每一个需求都可能出现在下一个版本里。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议