微信小程序开发入门之共享账本(十三)

接着上一篇




微信小程序操作mysql 微信小程序操作cad_微信小程序操作mysql


(备注:微信小程序的wxml文件相当于HTML文件,wxss文件相当于CSS文件,js文件就是JavaScript文件,数据库为NoSQL数据库,数据库脚本语言也同NoSQL)

(ps:区块链最近可真是火,但是也不能因此乱了方寸,做事要有始有终不是,等写完小程序的文章再和大家共同学习下区块链的知识吧)

在开启本篇之前,还是先回顾下之前不足的地方。

翻看代码的时候发现了一个问题,在index.jsonLoad函数中我们调用了系统方法wx.getSettingwx.getUserInfo,仔细想想这两个方法其实都是不必要去调用的,关于授权的工作应该都放在welcome页面中去做,到了index页面,我们只需要关心用户信息和默认账本的初始化有没有成功

所以,我们可以把index.js中的onLoad函数大大简化,只留下一行代码

onLoad: function (options) { this.verify()}

即可

运行验证一下


微信小程序操作mysql 微信小程序操作cad_微信小程序操作mysql_02


undefined

这是因为我们去掉了onLoad中的wx.getSettingwx.getUserInfo,所以name字段没有赋值,下面我们要从verify的返回中取用户的信息


微信小程序操作mysql 微信小程序操作cad_地籍cad的lisp程序大集合_03


还记得verify云函数的内容吧,去查询user集合和acctBook集合,如果有一个没数据就返回失败,否则返回账本信息。其实我们用户信息也查了的,一起返回,岂不快哉

修改verify云函数成功返回的那一句为

return Promise.resolve({userInfo:r1.data,acctBookInof:r2.data})

这样一次验证过程中用户信息和账本信息就都有了

然后在index.jsdata中删掉name字段,新增下面两个字段

userInfo:{},acctBookInfo:{},

分别存储用户信息和账本信息

再将verify函数的返回成功then部分内容稍加改动

this.setData({ userInfo:res.result.userInfo [0], acctBookInfo:res.result.acctBookInfo [0]}) wx.showToast({ title: "欢迎你," + res.result.userInfo [0].name, image: '/images/smile.png'})

保存了用户和账本信息,wx.showToast的名称从返回中取。

注意一点,因为返回的都是数组,所以要取第一个,别漏了[0]

编译运行,一切正常


微信小程序操作mysql 微信小程序操作cad_字段_04


对于记录存储,之前我们是用一个临时集合tempAcctBook来记录,其实也可以

但是将所有记录存在一个表里肯定会导致表的数据过大,影响查询效率,所以我们可以依照实际情况建多个集合,再根据账本名称或者其他字段进行分库(就是对账本名称设计一个算法,比如取模,然后根据结果把记录存到对应的集合中),并且隔一段时间对集合做一次备份

比如建四个集合bill0,bill1,bill2,bill3,然后根据账本名称的hash值模4进行分库(或者用一致性hash算法来分库,更优秀)

当然,这些都是数据量大的情况下需要考虑的,自用的话请忽略

这里我们就建一个集合就行了,取名bill1


微信小程序操作mysql 微信小程序操作cad_地籍cad的lisp程序大集合_05


bill1的结构设计如下


微信小程序操作mysql 微信小程序操作cad_地籍cad的lisp程序大集合_06


我们在调新建记录组件时也不需要再传acctBookName了,因为账本名称是后台自动计算得到的,现在我们需要传一个acctBookId来唯一标识一笔记录属于哪个账本,所以把newBillSteps.jsproperty字段修改一下

properties: { accountBookId:{ type:String, default:'' }}

generateBill函数中加上acctBookId字段

acctBookId:this.data.accountBookId

然后将complete函数调用云函数addBill传入的acctBookName删除

let result = wx.cloud.callFunction({ name: 'addBill', data: { bill: bill }})

并将addBill云函数中的集合名称写成固定的bill1

db.collection('bill1')

最后在index.wxml中传入acctBookId

编译运行,新增记录


微信小程序操作mysql 微信小程序操作cad_地籍cad的lisp程序大集合_07


查看云数据库,记录存储成功


微信小程序操作mysql 微信小程序操作cad_微信小程序操作mysql_08


然后我们在index.js中添加对集合bill1的实时监控,当bill1的内容发生变化时,可以实时在页面中表现出来

先定义两个个全局变量

const db = wx.cloud.database()const watcher = null

db是数据库对象,watcher是我们将要添加的监听器引用

然后添加一个函数setWatcher

setWatcher: function (acctBookId) { console.log('setWatcher acctBookId:',acctBookId) let that = this this.watcher = db.collection('bill1').where({ acctBookId: acctBookId }).watch({ onChange: function (snapshot) { that.setData({ billItems: snapshot.docs }) }, onError: function (err) { console.error('监控发生错误', err) } })}

该函数的作用是对指定的集合和条件下符合的数据进行监听(watch),在数据发生变化时会触发onChange事件,我们可以在此事件内对相应变化进行反应

这里暂时未进行特殊判断,每次都将全量的数据snapshot.docs赋值给billItems,这样做也没问题,因为我们也不需要对发生变化的数据有任何特殊操作,只是数据量大的情况下可能会影响效率,暂时可以不考虑这个问题,后面会改进

最后在verify函数成功的回调中加上一句

this.setWatcher(res.result.acctBookInfo[0]._id)

来启用监听

编译运行程序,已有数据会自动加载进来


微信小程序操作mysql 微信小程序操作cad_微信小程序操作mysql_09


如果从云端数据库删除这条数据,显示也会同步更新


微信小程序操作mysql 微信小程序操作cad_微信小程序操作mysql_10


OK,今天就先到这,下一篇继续讲数据监听问题,同时要加个新功能


微信小程序操作mysql 微信小程序操作cad_微信小程序操作mysql_11