使用LeanCloud小程序SDK实现商品评价模块

前言

商品评价是商城系统中非常典型的应用,这个例子演示了LeanCloud用户登录与获取,数据添加与读取,图片上传等常见技能点。

需求分析

  • 写入一条带描述与多图组的评价纪录
  • 记录用户对象,关联商品对象
  • 评价显示在商品详情底部

添加评价演示

evaluate.gif

评价列表显示

评价列表

技能点

  • LeanCloud小程序sdk常用api
  • Promise.all()同步多个网络请求
  • 小程序表单控件textarea访问取值与小程序页面传值

前端UI部分

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

LeanCloud存储部分

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

  • 建表
建表
  • 建字段
建商品字段
建用户字段
图组字段

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

js库下载地址:https://unpkg.com/leancloud-storage@%5E3.0.0-alpha/dist/av-weapp-min.js

下载将它放在/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) {
    // 取出商品id
    var objectId = options.objectId;
    // 存在当前页面data中,以提交评价表使用
    this.setData({
        objectId: objectId
    });
},

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

浏览与上传图片

wx.chooseImage是小程序提供的图集浏览api,使用方法见https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-picture.html#wxchooseimageobject,它将返回一个
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提供的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()方法,相当于saveOrUpdate为一个方法。往往是编辑页面时在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,以区分嵌套内层循环的数据。av.min.js升级到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>

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

结尾

到此,完成了图片上传与评论添加的过程,对小程序开发有兴趣的朋友 可以关注我的个人订阅号【黄秀杰】。

源码下载

http://git.oschina.net/dotton/lendoo-wx,文中涉及代码保存于/pages/member/evaluate文件夹中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容