【 玩转 LeanCloud 】开发者经验分享:
作者:黄秀杰

在商城系统中给商品添加评价是一种非常典型的需求,我下面要来演示一下如何借助 LeanCloud 的小程序 SDK 来快速完整地实现这个需求,包括如何处理用户登录和获取用户信息、数据添加和读取、图片上传等功能。

先列一下基本需求:

  • 写入一条带描述和多张图片的评价记录
  • 保存用户对象,关联商品对象
  • 评价显示在商品详情底部

添加评价演示:

评价列表显示:

前端 UI 要完成:

  • 绘制带「删除」按钮的九宫格
  • 一个文本域,供输入描述文字
  • 一个提交按钮

技能点:

  • LeanCloud 小程序 SDK 常用的 API
  • Promise.all() 并发处理多个网络请求
  • 小程序表单控件 textarea 访问取值与小程序页面传值

LeanCloud存储部分

新建一张Evaluate评价表,该表保存着多图url路径数组,同时还维护商品goods表与user表的关联,以表示哪个用户user针对哪个商品作出的评价。数据表在LeanCloud用Class表示,而外键关联在LeanCloud中使用Pointer类型表示,建表与建字段如下图所示。

  • 建表

  • 建字段

  • 建用户字段

  • 图组字段

引入LeanCloud小程序JS库——av-weapp.min.js

js库下载地址:https://unpkg.com/leancloud-s...

下载将它放在/utils/目录下,然后在需要的js页面按如下方式引入

const AV = require('../../../utils/av-weapp.js')

然后按下面方式初始化,初始化过程只用操作一次,因此可以放到app.js执行。

// 初始化AV
const AV = require('./utils/av-weapp.js');
const appId = "7tm1OFlNlmLFxxxoHsz";
const appKey = "XxNkFIrxxxal0ttvj";AV.init({ appId: appId, appKey: appKey
});

创建评论页面

/pages/member/evaluate/ 目录下创建 4 个文件:

  • evaluate.js
  • evaluate.json
  • evaluate.wxml
  • evaluate.wxss

LeanCloud 一键登录与获取当前用户

取出当前用户后,与描述内容、图片数组、商品关联一并提交到网络:

AV.User.loginWithWeapp();
var user = AV.User.current();

小程序端从wxml中取出textarea的值

在 wxml 文件个添加一个 textarea 控件,通过 bindblur 事件获取它的值:

<textarea value="{{content}}" name="content" placeholder="请输入评价内容" maxlength="-1" auto-height bindblur="getContent" />

JS中实现取值并保于page的data中,供提交数据到网络之用:

 getContent: function (e) {that.setData({content: e.detail.value});},

在评论页接收上个页面传递来的商品 id

    onLoad: function(options) {// 取出商品 idvar objectId = options.objectId;// 存在当前页面 data 中,以保存到评价表this.setData({objectId: objectId});},

然后通过 LeanCloud SDK 的 AV.Object.createWithoutData 方法来得到被关联的商品对象,最终被提交到 Evaluate 表中。

浏览与上传图片

wx.chooseImage 是小程序提供的图集浏览 API,使用方法见 https://mp.weixin.qq.com/debu...,它会返回一个tempFilePaths 数组,之后用它上传给 LeanCloud 云端。

chooseImage: function() {// 选择图片wx.chooseImage({sizeType: ['compressed'],sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有success: function(res) {// 返回选定照片的本地文件路径列表,tempFilePath 可以作为 img 标签的 src 属性显示图片var tempFilePaths = res.tempFilePaths;console.log(tempFilePaths);that.setData({images: that.data.images.concat(tempFilePaths)});}})},

上传图片得到图片 url 数组

上传通过 LeanCloud SDK 的 AV.FIle#save() 方法完成。由于上传是异步操作的,因此这里用 Promise.all 方法等全部图片上传完成后再把返回的 image url 数组提交到网络。

// 提交图片,事先遍历图集数组
var promises = that.data.images.map(function(tempFilePath) {return new AV.File('file-name', {blob: {uri: tempFilePath,},}).save();
});
Promise.all(promises).then(function(files) {// Promise 返回待上传图片数组var uploadedImages = files.map(function(file) {return file.url();});console.log(uploadedImages);}
);

提交数据到 LeanCloud

先创建对象 evaluate,然后通过 set 方法设置成员变量值,最后调用 save() 方法提交数据到 LeanCloud:

// 提交数据到网络
var evaluate = new AV.Object('Evaluate');
// 设置图组
evaluate.set('images', uploadedImages);
// 设置用户提交的描述
evaluate.set('content', that.data.content);
// 设置当前用户
evaluate.set('user', AV.User.current());
// 关联商品
evaluate.set('goods', AV.Object.createWithoutData('Goods', that.data.objectId));
// 保存到LeanCloud数据表
evaluate.save().then(function() {// 弹出提示wx.showToast({title: '评价成功',success: function() {// wx.navigateBack();}});
}, function(err) {console.log(err);
});

如果是 update 操作,那么需要这个对象要有 ObjectId,同样是调用 save() 方法。通常是在编辑页面的时候已经在 data 中保存了读取到的 object,然后再 save() 这样就变成 update 操作了。

这时就能看到开篇的多图上传 gif 动图里的效果了。

后台查看存储结果

登录 LeanCloud 后台,找到 Evaluate表,看到数据已经插入成功了。其中 goods 与 user 分别指向商品与用户对象,点击链接可以跳转查看到关联的商品与用户的数据。


表中数据

在商品详情处列表渲染

查询操作使用 query#find() 方法,关联表的字段需要使用 include('xx_table') 设定,查询条件全匹配使用 equalTo:

getEvaluateByGoods: function (goodsId) {var query = new AV.Query('Evaluate');   // 查询关联表的数据需要调用设置 include 属性,可以多次设定query.include('user');// 查询条件设定为当前 goods 对象query.equalTo('goods', AV.Object.createWithoutData('Goods', goodsId));// 查询所有记录query.find().then(function (evaluateObjects) {// 将返回结果返回到 data 数据中,以在 wxml 渲染that.setData({evaluateObjects: evaluateObjects})}, function (err) {console.log(err);});
},

相应的 wxml 布局

通过 wx:for 来遍历,并且指定 wx:for-item 以区分嵌套内层循环的数据。LeanCloud 小程序 SDK 升级到3.0后,成员变量可以很方便地使用点语法在 wxml 链接访问,比如 {{ evaluate.user.avatarUrl }}

<!-- 用户评价 -->
<view class="evaluate-container"><view wx:for="{{evaluateObjects}}" class="evaluate" wx:for-item="evaluate"><view class="avatar"><image src="{{evaluate.user.avatarUrl}}" /></view><view class="main"><view class="nickname">{{evaluate.user.nickName}}</view><view class="content">{{evaluate.content}}</view><view class="gallery"><view class="image-container" wx:for="{{evaluate.images}}" wx:for-item="url"><image src="{{url}}" /></view></view></view></view>
</view>

这时能看到开篇的那张商品详情的截图效果。

大功告成,超 easy 是不是!源码地址 http://git.oschina.net/dotton...,文中所涉及的代码保存在 /pages/member/evaluate 文件夹中,欢迎 fork 和讨论。

超详细步骤 | 如何用小程序 SDK 实现电商评价模相关推荐

  1. 如何通过小程序建立化妆品电商平台?

    通过小程序建立化妆品电商平台可以让消费者方便地浏览和购买化妆品产品,以下是一些建立化妆品电商平台的步骤: 1.注册小程序账号:在微信公众平台上注册小程序账号,并选择适合的小程序模板. 2.产品选购:与 ...

  2. 小程序和vue语法对比_商城小程序对比传统电商的优势如何?

    自移动互联网兴起后,许多企业都将自己的业务重心转移到移动端.目前,小程序发展异常火爆,大家都争先恐后,通过长沙小程序开发,来布局自己的商城小程序.不过由于小程序发展较短,许多企业对此不甚了解.那么接下 ...

  3. 玩转KOL,小程序社交信用电商小优店完成A轮千万美元融资

    [猎云网(微信:ilieyun)北京]7月17日报道(文/薄冬梅) 在自己关注的公众号下找到商品购买入口,进入小程序挑选商品,支付购买-- 或者,在微信主页面,下拉小程序任务栏,找到自己关注的公众号运 ...

  4. php实现秒杀倒计时,小程序中实现电商秒杀倒计时的效果

    在电商应用中,经常会用到秒杀,那么秒杀会有个倒计时功能,这里我们把上次给大家展示的倒计时功能用到电商应用中去. 基本实现功能 1,小程序仿电商网站秒杀倒计时 2,显示格式为:例如 1天11时11分11 ...

  5. 零基础通过直播小程序组件实现电商带货

    之前,我们已经介绍了即构小程序直播组件的功能.适用类目以及组件的集成方法,可以戳下面查看: 即构小程序组件功能及适用类目 即构小程序组件的集成指引 小程序直播功能可应用的场景非常广泛,例如秀场直播.在 ...

  6. 基于微信小程序的农产品电商平台精准营销模式创新研究

    目 前在农产品销售过程出现一个非常严重的问题─滞销, 我们时不时的能在新闻报道看到某地区农产品大量上市却少有客商前来收购, 甚至一度出现大量新鲜的农产品烂在地头无人问津, 被当作垃圾一样扔掉. 客商在 ...

  7. 【愚公系列】2022年11月 微信小程序-优购电商项目-商品详情页面

    文章目录 前言 一.商品详情⻚⾯ 1.业务逻辑 2.涉及的接口数据 3. 关键技术 二.商品详情⻚⾯相关代码 1.页面代码 2.效果 前言 商品详情页是展示商品详细信息的一个页面,承载在网站的大部分流 ...

  8. 智慧物业小程序_刷脸支付+电商小程序+智慧酒店营销方案

    我们这边刷脸支付+电商小程序+智慧酒店行业解决方案,支付宝微信订房小程序,芝麻信用免押住,数字化经营发券引流,未来酒店:0押金 0房费 退房扣款,不占用资金,用户增长信用分,线上订房小程序,无接触服务 ...

  9. 【愚公系列】2022年11月 微信小程序-优购电商项目-授权页面

    文章目录 前言 1. 授权页面 一.授权页面 1.业务逻辑 2.涉及的接口数据 二.授权页面相关代码 1.页面代码 2.效果 前言 前言:由于微信官方修改了 getUserInfo 接口,所以现在无法 ...

最新文章

  1. 诚聘英才,共创未来!华南农业大学农学院高层次人才招聘
  2. excel随机数_Excel使用函数生成1100的不重复随机数 2种方法
  3. 改编码格式_编码不规范,同事真的会两行泪?
  4. java每秒执行一次_Java性能权威指南
  5. Linux系统编程——I/O多路复用select、poll、epoll
  6. 【Tensorflow】slim.arg_scope()的使用
  7. pku 2387 Til the Cows Come Home
  8. [BZOJ5010][FJOI2017]矩阵填数(状压DP)
  9. 利用DataSet、DataTable、DataView按照自定义条件过滤数据
  10. 5A通过PMP考试分享
  11. 阿里云mysql数据库日志_阿里云mysql数据库操作日志
  12. 内存数据库 TimesTen
  13. android x86玩和平精英,和平精英iOS和安卓可以一起玩吗 和平精英iOS和安卓数据互通吗...
  14. python3.7爬取墨菲定律保存在本地txt
  15. android锁屏壁纸设置,安卓锁屏壁纸怎么换 安卓锁屏壁纸设置教程
  16. 【父亲节H5】用独特的方式表达最深沉的爱!
  17. python关于二手房的课程论文_python爬取链家二手房信息
  18. 填写个人资料的HTML文件,vsco注册填写个人资料名称无效怎么办?vsco怎么注册账号?...
  19. 一、YouTube-8M 初探(视频与音频分类)
  20. Python 编辑器哪个好用

热门文章

  1. day22:更换yum源及源码包安装
  2. 02-NLP-04基于统计的翻译系统-03-短语翻译表构造——短语抽取
  3. angular使用动态组件后属性值_Angular 2-组件
  4. java中priorityqueue_详解JAVA中priorityqueue的具体使用
  5. 双精度浮点数转换_模型压缩一半,精度几乎无损,TensorFlow推出半精度浮点量化工具包,还有在线Demo...
  6. java asm源码分析_探究CAS原理(基于JAVA8源码分析)
  7. [JS进阶] JS 之Blob 对象类型
  8. 游戏盒子源码_如何用8K电视盒子组建“家庭影院”(设备入门篇)
  9. android 加载layout,Android自定义View加载视图之LoadingLayout
  10. 郑州大学Oracle期末,郑州大学软件学院2011到2012学年第二学期Oracle期末试卷.doc