赞
踩
前阵子做了个微信小程序的项目,这次来主要讲讲云函数上的数据库操作。本文将按照以下顺序进行讲解:
目录
小程序的入门学习建议:以微信小程序的开发文档为准,结合网上代码案例进行练习。
下面简单说一下云函数和数据库操作。
先看看官方介绍:云开发之云函数。
简单来说,就是将函数放在了云端(服务器端),在小程序端进行调用。
上面图中红框内的都最好过一下,代码部分的需要上手去敲。但官方文档还是不够,感觉有些细节问题会被省略掉,需要再度一下网友们的解决方法。
官方文档:云开发之数据库。
与平时操作的MySQL、Oracle不同,小程序中的 “ 数据库表 ” 叫 “数据库集合 ” 。不强制要求固定的字段(即,列):
对比下上面3条数据的字段(红框画出的),集合的随意性可见一般。
官方介绍数据类型。
GeoPoint不见得是数据库中常见的数据类型。官方文档说,GeoPoint是表地理位置点,记录经纬度,简单理解为某点坐标(x,y)吧。
虽有打算用,但没有实际用上。GeoPoint就不详细讲了。
如果涉及『其他用户可以改动别人创建的数据』这种情况的话,建议将数据库操作放在云端。
(一般来说还是这种情况是偏多的,建议直接放在云端)
下图表是个人总结的二者的比较:
编号 | 关键词 | 小程序端 | 云端 |
---|---|---|---|
1 | _openid | 新插入的数据会自动附上用户的_openid | 新插入的数据不会附上用户的_openid |
2 | 条数限制 | 查询上限20条 | 查询>20条 (不记得上限是100条还是无) |
3 | 权限限制 | =用户端。
操作者视为小程序端的用户/创建者身份,对数据的读写权限受限 (数据库权限设置见下图) 权限依据是第1条中自动附上的_openid | =管理端。
操作者视为管理端身份,可对数据增删改查 |
我的相关参考条目:
(点开开发者工具左上角的“云开发”按钮可以进入到下图所示控制台)
官方文档:数据库权限设置说明
下面对云端操作数据库(增查改)进行介绍:
在正式用云函数之前,需要进行的设置。
首先要进行云函数的依赖安装,当时我参考的博文:微信小程序云开发 | 云函数安装依赖。
我这里再自己写写过程:
(1)对云函数的文件夹右键,点击“新建Node.js云函数”
(2)出现新生成的云函数文件夹,这时候图标还是文件夹而不是云
(3)对这个新生成的文件夹右键,选择“在终端打开”
(4)这时候出现命令窗,粘贴下面这行代码上去,回车执行:
npm install --save wx-server-sdk@latest
依赖安装好后的命令窗:
这时候看刚刚的文件夹,图标已经变成了云,且文件夹下多了个package-lock.json文件
(5)收尾工作
写好云函数后记得上传,要是有新的改动也要重新上传
由于本次项目中没有进行删除操作,在此只介绍对数据的增、查、改。
发起订单
- // 云函数入口文件
- const cloud = require('wx-server-sdk')
- cloud.init();
- const db = cloud.database();//注意,不是wx.cloud.database(),这种是小程序端操作数据库的写法。云端没有“wx.”
-
- // 云函数入口函数
- exports.main = async (event, context) => {
- const wxContext = cloud.getWXContext()//目的:获取_openid
-
- try {
- return await db.collection("order").add({
- data: {
- normalUser: wxContext.OPENID,//获取操作者_openid的方法
- recycleUser: '',
- acceptTime:'',
- followID:event.followID,
- cancelTime:'',
- orderType: event.orderType,
- wasteType: event.wasteType,
- recycleTime: event.recycleTime,
- recycleLocate1: event.recycleLocate1,
- recycleLocate2: event.recycleLocate2,
- service: event.service,
- serviceDetail: event.serviceDetail,
- weight: event.weight,
- acceptPrice1: event.acceptPrice1,
- acceptPrice2: event.acceptPrice2,
- createTime: event.createTime,
- orderState: "待接单",
- doneTime: event.doneTime,
- peopleNum: 1,
- sellerName: event.sellerName,
- tele: event.tele,
- img: event.img,
- distance: event.distance,
- lat: event.lat,
- lng: event.lng
- }, success: res => {
- //wx.showToast({
- // title: '订单发起成功',
- //})
- }, fail: err => {
- //wx.showToast({
- //icon: 'none',
- //title: '订单发起失败',
- //})
- }
- })
- } catch (e) {
- console.log(e)
- }
- }
- const db = wx.cloud.database();
- wx.cloud.callFunction({
- name: 'orderAdd',
- data: {
- normalUser : app.globalData._openid,
- //上门这句。这样子其实传不了_openid,
- //???(不知道为什么,手机端的话是传不了,查数据库见到会是空值;但调试时是可以传的,数据库里会有相应的值。有点迷,留个坑)
- //_openid的存储需要通过在云端通过wx.Context获取(就是上面云端的做法)
- followID:app.globalData.followID,
- orderType: e.detail.value.orderType,
- wasteType: e.detail.value.wasteType,
- recycleLocate1: e.detail.value.recycleLocate1,
- recycleLocate2: e.detail.value.recycleLocate2,
- recycleTime: e.detail.value.recycleTime,
- service: e.detail.value.service,
- serviceDetail: e.detail.value.serviceDetail,
- weight: e.detail.value.weight,
- acceptPrice: e.detail.value.acceptPrice1 + "~" + e.detail.value.acceptPrice2 ,
- buyerID: '',
- createTime: util.formatTime(new Date()),
- orderState: '待接单',
- doneTime: '',
- peopleNum: 1,
- sellerName: e.detail.value.sellerName,
- tele: e.detail.value.tele,
- img: 'cloud://pinsoso-ide.7069-pinsoso-ide/rubbish1.jpg',
- distance: '0.2',
- lat: this.data.lat,
- lng: this.data.lng
- }, success: res => {
- console.log('已添加至订单')
- wx.showToast({
- duration:4000,
- title: '新订单添加成功'
- })
-
- },
- fail: err => {
- app.globalData.followID = "";
- wx.showToast({
- icon: 'none',
- title: '出错啦!请稍后重试'
- })
- console.error
- }
查询订单状态(orderState)为“待接单”&&订单类型(orderType)为“拼单”&&followID为空的订单
云函数orderQuery
- // 云函数入口文件
- const cloud = require('wx-server-sdk')
- cloud.init()
- const db = cloud.database()
- // 云函数入口函数
- //查询"附近拼单"
- exports.main = async (event, context) => {
- try {
- //order
- return await db.collection('order').where({
- //下面这3行,为筛选条件
- orderState:"待接单",
- orderType:"拼单",
- followID:''
- }).get({
- success: function (res) {
- return res
- }
- });
- } catch (e) {
- console.error(e);
- }
- }
- //查询附近拼单
- wx.cloud.init({
- traceUser: true
- })
- wx.cloud.callFunction({
- name: 'orderQuery',
- complete: res => {
- console.log("***orderQuery");
- this.setData({
- nearbyOrder: res.result.data,
- })
- }
- });
修改订单状态为“已完成”,还要更新订单的完成时间
云函数orderUpdatetoRecycleDone
- // 云函数入口文件
- const cloud = require('wx-server-sdk')
- cloud.init()
- const db = cloud.database();
- // 云函数入口函数
- exports.main = async (event, context) => {
- try {
- //这里的update依据是event._id
- return await db.collection("order").doc(event._id).update({
- data: {
- doneTime: event.doneTime,//订单完成时间
- orderState: "已完成"//订单状态
- }
- })
- } catch (e) {
- console.error(e)
- }
-
- }
- //完成订单
- orderDone: function (e) {
-
- //改变order的orderState从"待完成"到"已完成"
- console.log("orderDone这里改变接单状态")
-
- //调用云函数
- wx.cloud.callFunction({
- name: 'orderUpdatetoRecycleDone',
- data: {
- _id: app.globalData._detailpage,
- doneTime: util.formatTime(new Date())
- },
- success: res => {
- console.log("***完成订单:ok")
- //刷新页面数据
- wx.showToast({
- title: '完成订单',
- duration: 2000,
- success: function () {
-
- //设置延时执行
- setTimeout(function () {
-
- //关闭当前页面,返回并刷新上一级页面-----------------------
- var pages = getCurrentPages();//获取当前打开的页面栈,返回为数组,索引顺序为打开的顺序
- var prePages = pages[pages.length - 1];//获取到上一个页面对象
- prePages.onShow();//执行上一个页面对象中的刷新数据方法
- //返回上一级页面
- wx.navigateBack({
- delta: 1,
- })
- }, 3000) //延迟时间
- }
- })
- },
- fail: err => {
- console.log("***完成订单:no")
- wx.showToast({
- icon: 'none',
- title: '出错啦!请稍后重试',
- duration: 2000,
- success: function () {
- setTimeout(function () {
- //要延时执行的代码
- //关闭当前页面,返回并刷新上一级页面-----------------------
- var pages = getCurrentPages();//获取当前打开的页面栈,返回为数组,索引顺序为打开的顺序
- var prePages = pages[pages.length - 1];//获取到上一个页面对象
- prePages.onShow();//执行上一个页面对象中的刷新数据方法
- //返回上一级页面
- wx.navigateBack({
- delta: 1,
- })
- }, 3000) //延迟时间
- }
- })
- console.error
- }
- });
-
- },
若是有不对的地方劳烦各种指正!或有不同见解也欢迎留言交流~
鞠躬~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。