《微信小程序实战(3) · 推广海报制作》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • 海报生成
      • 需求简介
      • 功能分析
      • 小程序码生成
      • 绘制canvas海报
      • 小程序页面接收
    • 总结陈词

写在前面的话

本篇文章是微信小程序系列的第三篇,本着介绍实用功能块的原则,这边将分享一下实战中十分常见的推广海报生成功能,让我们开始。

相关文章
《微信小程序实战(1)· 开篇示例 》
《微信小程序实战(2) · 组件封装》


海报生成

需求简介

通常微信小程序开发完毕后,进入运营阶段,主要就是不断推广分享,积累用户。

单纯依靠基础的onShareAppMessage,只能实现微信聊天中的分享,效果较为一般。

通常会选择生成带小程序码的推广海报,这样可以用于朋友圈、地推等多种运营手段。

具体如下所示,那具体要怎么实现呢?

功能分析

要实现的海报效果,涉及若干知识点,也可以拆解为若干步骤。

1、第一步要做的就是生成带有个人或详情信息的小程序码。

2、接着就是要用到小程序的canvas画布技术,拼接信息生成海报;

3、实现图片分享效果,这里的方式多种;

接下来进一步将功能实现。


小程序码生成

小程序的海报之所以具备分享功能,主要还是依靠小程序码,小程序码除了用于定位具体页面,通常还包含特殊的业务属性。

官网提供了多种小程序码的生成API,参考:微信小程序官方文档 - 小程序码

海报制作场景,我们通常采用获取不限制的小程序码方式,如何调用API参考上方教程即可。

这边给出部分示例代码:
1、前端调用

ace.sendGet是封装的http工具方法,具体封装参考《微信小程序实战(1)· 开篇示例 》。

调用成功就继续下一步的绘制海报。

ace.sendGet('wxmin/user/' + app.globalData.appId + '/getPoster?page=mark&scene=' + that.data.markId, function (data) {if (data) {that.eventDraw(data)} else {ace.msg('生成小程序码失败~');}
});

2、后端逻辑

这里使用的是开源的微信小程序后端API封装依赖weixin-java-miniapp,感兴趣的可以搜索一下。

值得注意的是,小程序码的场景值只允许传递一个32位的字符,通常会传递详情页的ID或推荐人ID,如果两个信息都要怎么办?那就是先组装信息,生成一个UUID,然后以K-V的结构存储在Redis中,最终以Key作为场景值。具体扫码进入的页面,根据这个key再解析出对应信息即可。

@GetMapping("/getPoster")
public ResultModel getPoster(@PathVariable String appId, String scene, String page) {final WxMaService wxService = WxMaConfiguration.getMaService(appId);try {//省略页面的处理//省略场景值的处理//生成小程序码File tempFile = wxService.getQrcodeService().createWxaCodeUnlimit(scene, page);return ResultModel.success(AliOSSUtil.upload(tempFile));} catch (Exception e) {e.printStackTrace();}return null;
}

绘制canvas海报

微信小程序的Canvas技术是一种在微信小程序中绘制图形和动画的API,它允许开发者使用JavaScript和Canvas 2D API在页面上创建丰富的图形和动画效果。

首先,我们先看一下官网,微信小程序官方文档 - canvas,能了解到部分信息。

其实,海报生成功能,主要是这点比较有难度,对于后端程序猿而言,样式本来就不擅长,还要用到canvas,对于前端程序猿而言,大部分接触到canvas的比较少,属于知识盲区。没办法,这个是小程序必备功能,绕不过了,迎难而上吧。

好在我们虽然不擅长,但懂得找,于是找到了一款不错的海报组件,用这套模板可以减少我们不少工作量。

下面贴出关键代码,模板参考:链接

Step1、引入插件

"usingComponents": {"canvasdrawer": "/components/canvasdrawer/canvasdrawer"
}

Step2、页面添加组件

<!-- 海报制作 -->
<view class='poste_box' wx:if="{{showCanvas}}" id='canvas-container'><canvasdrawer painting="{{painting}}" class="canvasdrawer" bind:getImage="eventGet"/>
</view>

Step3、编写核心逻辑

   /*** 海报绘制*/eventDraw(img) {let that = this;let markInfo = that.data.markInfowx.showLoading({title: '绘制分享图片中', mask: true})this.setData({painting: {width: 375, height: 555, clear: true, views: [{type: 'image',url: '~~~',top: 0,left: 0,width: 375,height: 555}, //外框图片{type: 'image', url: markInfo.imgUrl1, top: 26, left: 30.5, width: 320, height: 415}, //主图片{type: 'image', url: img, top: 460, left: 285, width: 65, height: 65}, //小程序码{type: 'text',content: markInfo.markName,fontSize: 16,lineHeight: 21,color: '#383549',textAlign: 'left',top: 460,left: 34,width: 287,MaxLineNumber: 2,breakWord: true,bolder: true}, //标记名称{type: 'text',content: '分享人:' + markInfo.userName,fontSize: 13,color: '#7E7E8B',textAlign: 'left',top: 490,left: 34, // textDecoration: 'line-through'}, //分享人{type: 'text',content: '二维码长期有效',fontSize: 13,color: '#7E7E8B',textAlign: 'left',top: 515,left: 34, // textDecoration: 'line-through'} //文字提示]}})},/*** 展示图片*/eventGetImage(event) {let that = thisconst {tempFilePath, errMsg} = event.detailwx.hideLoading()if (errMsg === 'canvasdrawer:ok') {setTimeout(function () {wx.previewImage({current: tempFilePath, // 当前显示图片的http链接urls: [tempFilePath] // 需要预览的图片http链接列表});that.setData({showCanvas: false, shareImage: tempFilePath});}, 1000)}}

最终点击页面按钮,可以生成如下效果。

值得一提的是:

1、绘制完canvas后,这边是选择wx.previewImage预览功能,实现图片的分享和保存,也可以添加保存到本地的功能,这些都是可选的;

2、绘制过程中,尽量先用静态的图片和文字,不断尝试调整效果,最后满意了,再替换为动态信息,这样可以节省很多时间;


小程序页面接收

这边就是描述,小程序码识别后进入具体页面,如何处理,下方是一段示例代码。

onLoad: function (options) {let that = this;let markId = options.id || '24889222fb8a4f2db26d6c7487280cc1'//场景值if (options.scene) {markId = decodeURIComponent(options.scene);}if (!markId) {ace.msg('页面缺失标记ID');return;}//获取用户信息ace.getUserInfo(function (data) {that.setData({userObj: data, markId, payNo: data.payNo,}, function () {//初始化页面逻辑that.initHandle();})});
},

总结陈词

此篇文章是《微信小程序实战》系列的第三篇,后续会继续分享小程序实战技能,希望可以帮助到大家。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432393.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

火车票有电子发票吗?没纸质火车票怎么报销?

火车票有电子发票吗&#xff1f; 火车票、高铁票目前没有电子发票&#xff0c;但是现在已经实行电子客票&#xff0c;车票即购票证件&#xff0c;乘车时&#xff0c;只需购票证件原件&#xff08;如身份证、护照、临时身份证等&#xff09;即可乘车。 没纸质火车票怎么报销&am…

英伟达发布NVLM 1.0:屠榜多模态任务,纯文本性能逆势提升

前沿科技速递&#x1f680; 随着文本大模型的发展&#xff0c;解码器架构已经成为文本处理任务的标准。然而&#xff0c;现有的多模态大模型架构却尚未统一&#xff0c;不同模型在选择 LLM 主干、视觉编码器以及训练数据上存在较大差异&#xff0c;且无法直接进行对比研究。为了…

凤凰模拟器V6中无人机如何设置“有头模式”

凤凰模拟器是一款专为航模新手设计的飞行模拟器&#xff0c;它能够模拟大疆无人机、各种穿越机、固定翼等多种飞行器&#xff0c;提供逼真的飞行体验。该软件的操作简单易懂&#xff0c;适合新手练习使用。 一般来说&#xff0c;打开凤凰模拟器&#xff0c;选择好机型&#xf…

vscode 配置django

创建运行环境 使用pip安装Django&#xff1a;pip install django。 创建一个新的Django项目&#xff1a;django-admin startproject myproject。 打开VSCode&#xff0c;并在项目文件夹中打开终端。 在VSCode中安装Python扩展&#xff08;如果尚未安装&#xff09;。 在项…

鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)天气应用案例

文章目录 一、布局简介二、典型布局场景三、侧边栏 SideBarContainer1、子组件2、属性3、事件 四、案例 天气应用1、UX设计2、实现分析3、主页整体实现4、具体代码 五、运行效果 一、布局简介 布局可以分为自适应布局和响应式布局&#xff0c;二者的介绍如下表所示。 名称简介…

Golang | Leetcode Golang题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; const highBit 30type trie struct {left, right *trie }func (t *trie) add(num int) {cur : tfor i : highBit; i > 0; i-- {bit : num >> i & 1if bit 0 {if cur.left nil {cur.left &trie{}}cur cur.left} else …

leetcode-189:轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

前端框架对比与选择

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f495; 目…

详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 HandlerInter…

量化交易四大邪术之三:春去花还在

网络相传亚洲有四大邪术&#xff0c;日本化妆&#xff0c;韩国整容&#xff0c;泰国变X&#xff0c;Z国PS。 这些都是让人在颜值上看起来很美&#xff0c;类似地&#xff0c;在量化交易领域&#xff0c;也有四大邪术能让净值曲线看起来很美&#xff0c;之前已经说了“般若波罗蜜…

CSS clip-path 属性的使用

今天记录一个css属性clip-path&#xff0c;首先介绍下这个属性。 clip-path 是CSS中的一个神奇属性&#xff0c;它能够让你像魔术师一样&#xff0c;对网页元素施展“裁剪魔法”——只展示元素的一部分&#xff0c;隐藏其余部分。想象一下&#xff0c;不用依赖图片编辑软件&am…

Python--类【详细教程】

类的介绍 面向对象编程&#xff08;object-oriented programming&#xff0c;OOP&#xff09;是最有效的软件编写方法之⼀。在面向对象编程中&#xff0c;你编写表示现实世界中的事物的类&#xff08;class&#xff09;&#xff0c;并基于这些类来创建对象&#xff08;object&…

C语言 | Leetcode C语言题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; typedef struct {int start;int index; } Node;int cmp(const void *pa, const void *pb) {return ((Node *)pa)->start - ((Node *)pb)->start; }int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSiz…

四川财谷通信息技术有限公司抖音小店强势引领电商

在数字经济蓬勃发展的今天&#xff0c;短视频与直播电商已成为推动消费增长的重要引擎&#xff0c;而抖音平台更是以其庞大的用户基础、精准的算法推荐和创新的商业模式&#xff0c;成为了众多商家争相入驻的蓝海市场。在这片充满活力的电商沃土上&#xff0c;四川财谷通信息技…

GPS冷启动定位不准问题

1.使用模块 EG800K 2.定位不准问题 应用场景&#xff1a;由于低功耗设备&#xff0c;需要GPS定位&#xff0c;设备的功耗会很高&#xff0c;因此每次定位完成后必须将模块的电源断开。 定位不准原因&#xff1a; 1.每次设备从供电&#xff0c;到定位成功&#xff0c;需要3…

【文心智能体】 旅游手绘手帐 开发分享 零代码 手绘风景 记录行程和心情 旅游攻略

旅游手绘手帐&#xff0c;点击文心智能体平台AgentBuilder | 想象即现实 目录 背景 创作灵感 开发历程 一、基础配置 二、高级配置 三、引导示例&#xff08;提示词&#xff09; 四、prompt&#xff08;提示词&#xff09;优化 期待优化 背景 这个智能体是一个零代码…

CSS中的字体样式、文本样式、列表样式以及背景和渐变

一、字体样式和文本样式 1.span标签 span标签的作用&#xff1a;能让某几个文字或者是词语凸显出来 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-…

在深度学习中,是否应该打破正负样本1:1的迷信思想?

Q&#xff1a;是否应该打破正负样本 1:1 的迷信思想&#xff1f;A&#xff1a;是的&#xff0c;类别不平衡的比例只是表象&#xff0c;并非本质。 Q&#xff1a;当训练集和测试集分布匹配&#xff0c;但正负样本比例仍然悬殊&#xff0c;是否有必要再引入处理不平衡样本的策略…

新峰商城之订单处理流程

订单处理是电商系统中的重要模块&#xff0c;从用户单击提交订单并成功生成订单开始&#xff0c;包括订单支付成功、订单信息确认、订单出库、到确认收货的正常订单流程。也包括了订单取消、订单退款等其它异常流程。 一、订单处理流程 正常流程&#xff1a; 订单生成后&…

Git - 初识版本库

版本库也叫仓库&#xff0c;英文名 repository。 ‍ 创建版本库 之前我们说了版本库的概念&#xff1a; 存储版本的地方&#xff08;存放各个版本之间差异的地方&#xff09;&#xff0c;通常称为版本库。通常版本库是以文件&#xff08;夹&#xff09;的形式存放在磁盘上&a…