这是一个网上购买优惠代金券的小程序,数据自己写的,比较粗糙,数据存放在云数据库,所以数据读写都是对数据库进行操作
一、首先让我们来看看主要界面

"tabBar": {
"color": "#a9b7b7",
"selectedColor": "#13227a",
"borderStyle": "black",
"list": [
{
"selectedIconPath": "images/homes.png",
"iconPath": "images/home.png",
"pagePath": "pages/index/index",
"text": "首页"
},
{
"selectedIconPath": "images/searchs.png",
"iconPath": "images/search.png",
"pagePath": "pages/search/search",
"text": "查找"
},
{
"selectedIconPath": "images/members.png",
"iconPath": "images/member.png",
"pagePath": "pages/member/member",
"text": "黑卡会员"
},
{
"selectedIconPath": "images/indents.png",
"iconPath": "images/indent.png",
"pagePath": "pages/indent/indent",
"text": "订单"
}
]
},
在显示商品、订单方面,运用了有赞的商品卡片组件,为了不那么显示地单一,我自己根据显示需求,也写了相应合适的组件去展示。
二、界面方面,相信大家都轻车熟路,我就给大家展示一下数据库的操作
首先是查询,将数据展示到界面,这是最基础的,也分普通查询和条件查询
(1)普通查询
获取数据库引用
const db = wx.cloud.database();
构造查询语句,查找后进行赋值
var thst = this;
db.collection('goods').get({
success(res) {
console.log('查寻成功', res.data);
that.setData({
goods: res.data
})
}
})
(2)条件查询,这里我的数据有分类字段


var that = this;
db.collection('goods').where({
type: this.data.currentType,
site: this.data.currentSite
}).get({
success(res) {
console.log('查寻成功', res.data);
that.setData({
products: res.data
})
}
})
三、功能实现
1.在搜索功能上,将取出的数据进行筛选,这里我用的是indexOf方法

<view class="bodyview">
<van-search
value="{{ value }}"
placeholder="请输入搜索关键词"
use-action-slot
bind:change="onChange"
bind:search="onSearch"
>
<view slot="action" bind:tap="onClick">搜索</view>
</van-search>
<view hidden="{{value!=''}}" class="desc2">
<view class="text">热门搜索</view>
<view class="content" >
<block wx:for="{{search_thing}}">
<view bindtap="search2" class="content_view" data-content="{{item.thing}}">{{item.thing}}</view>
</block>
</view>
</view>
<view class="desc_4" >
<block hidden="{{searchResult.length==0}}" wx:for="{{searchResult}}">
<van-card
data-image="{{item.basic_info.traffic_light_img_href}}"
bindtap="show"
tag="热卖"
title="{{item.basic_info.food_name}}"
price="{{item.basic_info.calories_value}}"
thumb="{{item.basic_info.traffic_light_img_href}}"
data-id="{{item._id}}"
>
</van-card>
</block>
</view>
</view>
onClick() {
this.setData({
searchResult: []
})
let arr = [];
for (let i = 0; i < this.data.data.length; i++) {
let data = this.data.data[i];
let a = '';
a = data.type;
let b = '';
b = data.basic_info.food_name;
if (a.indexOf(this.data.value)>-1 && this.data.value.length > 0) {
arr.push(data)
}
if (b.indexOf(this.data.value) > -1 && this.data.value.length > 0) {
arr.push(data)
}
}
this.setData({
searchResult: arr
})
}
2.然后是商品查看,购买

buysuc(){
// console.log(this.data.buttonClicked)
// console.log(cfclick)
cfclick.ButtonClicked(this);
let date = new Date();
let year = date.getFullYear();
let month = date.getMonth();
let day = date.getDate();
let hours = date.getHours();
let minute = date.getMinutes();
let second = date.getSeconds();
let today = year+"年"+month+"月"+day+"日 "+hours+"时"+minute+"分"+second+"秒";
let pro = this.data.product[0];
productsCollection.add({
data:{
productid:pro._id,
productimg: pro.basic_info.traffic_light_img_href,
productprice: pro.basic_info.calories_value,
tags: pro.basic_info.food_name,
num:this.data.num,
membernum:this.data.membernum,
rednum:this.data.rednum,
pay:this.data.newmoney,
isuse:'未使用',
date: today
}
}).then(res => {
console.log(res);
})
setTimeout(function() {
wx.showToast({
title: '支付成功',
icon: 'success',
duration: 2000
})
wx.switchTab({
url:'../indent/indent',
success() {
var page = getCurrentPages().pop();
if (page == undefined || page == null) return;
page.onLoad();
}
})
}, 1000)
},
3.这些商品都是代金券,所以订单页面模拟一下,使用代金券,显然,使用后,是要对数据库里的数据进行修改的,然后就用到了自己建的并上传部署的云函数 use,delete,上传部署之前安装一下依赖:
npm install --save wx-cloud-sdk@latest


// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({
env: "chenfangwen-iigtn"
})
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
try{
return await db.collection('indent').doc(event.dataId).update({
data:{
isuse:'已使用'
}
})
}catch(err){
console.log(err)
}
}
delete/index:
const cloud = require('wx-server-sdk')
cloud.init({
env: "chenfangwen-iigtn"
})
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
try {
return await db.collection('indent').doc(event.dataId).remove()
} catch (err) {
console.log(err)
}
}
然后在要用到订单页面的js文件中引用,引用时传入订单id参数
use(e){
let id = e.currentTarget.dataset.id;
console.log(id)
var that = this;
wx.cloud.callFunction({
name:'use',
data:{
dataId:id
},
success: function (res) {
if (res.result.errMsg == 'document.remove:ok') {
console.log('调用成功----')
}
},
fail:console.error
})
// this.update; 更新过早
setTimeout(that.update,500)
}
delete(){
wx.cloud.callFunction({
name: 'delete',
data: {
dataId: this.data.id
},
success: function (res) {
if (res.result.errMsg == 'document.remove:ok') {
console.log('调用成功----')
}
},
fail: console.error
})
var that = this;
setTimeout(that.switch, 500)
},
四、然后再说说功能实现中遇到的几个问题,因为写的简单,所以问题感觉遇到的问题不多,希望对大家有用:
1.在搜索的时候,查询数据库获得商品数据后,再直接对商品的string类型字段检索,发现用不上indexOf方法然后用了以下操作后才通过,(声明一下,这里data.type本身就是string类型,然而data.type.indexOf会报错)
let data = this.data.data[i];
let a = '';
a = data.type;
if (a.indexOf(this.data.value)>-1 && this.data.value.length > 0) {
arr.push(data)
}
2.然后一个问题就是,在确认订单并购买时,多次点击购买,会在数据库中进行多次插入操作,添加多条数据,这里我就设置里一个变量控制点击事件
<button class="butttom2" bindtap="{{!buttonClicked?'buysuc':''}}">立即支付</button>
这里我在外边添加了一个util文件
var ButtonClicked = function (self) {
self.setData({
buttonClicked: true
})
}
module.exports = {
ButtonClicked: ButtonClicked
}
在点击函数里,引入一下
const cfclick = require('../../utils/util');
buysuc(){
cfclick.ButtonClicked(this);
let date = new Date();
let year = date.getFullYear();
let month = date.getMonth();
let day = date.getDate();
let hours = date.getHours();
let minute = date.getMinutes();
let second = date.getSeconds();
let today = year+"年"+month+"月"+day+"日 "+hours+"时"+minute+"分"+second+"秒";
let pro = this.data.product[0];
productsCollection.add({
data:{
productid:pro._id,
productimg: pro.basic_info.traffic_light_img_href,
productprice: pro.basic_info.calories_value,
tags: pro.basic_info.food_name,
num:this.data.num,
membernum:this.data.membernum,
rednum:this.data.rednum,
pay:this.data.newmoney,
isuse:'未使用',
date: today
}
}).then(res => {
console.log(res);
})
setTimeout(function() {
wx.showToast({
title: '支付成功',
icon: 'success',
duration: 2000
})
wx.switchTab({
url:'../indent/indent',
success() {
var page = getCurrentPages().pop();
if (page == undefined || page == null) return;
page.onLoad();
}
})
}, 1000)
},
五、结语
因为数据在云数据库里,我感觉对数据的处理方面感觉速度比较慢,也可能是我太心急了,没有仔细去探索细节,但感觉还是学到了较多的知识,如果以上有错误的地方,还请朋友们指出。