小程序云开发实践

小程序云开发的确给前端带来很多便捷,不需要去构建庞大的后端体系,不需要考虑服务器的各种配置以及运维. 但在实际操作中还是有不少局限, 至少从关系型数据库转型的初期是比较艰难的.

20190718235820-image.png

⬆️这个人是组长!

这是一个需求文档。 不,这是一个云开发的笔记

小朋友们的要求:

  1. 提问不需要积分
  2. 回答被有采纳功能,被提问者采纳获得1积分
  3. 上传一个文件获得1积分
  4. 下载一个文件需要消耗1积分
  5. 积分及作用于资源获取这个板块 寻找老师和学生与积分无关
  6. 积分可获取资源 (什么资源嗯)

用户注册

不同于普通的服务端,TCB (tecent cloud base) 的云函数获取用户的 userInfo 会转为 key 为 openId 和 appId 的 Object 数据,而不是你心目中想的 nickName avatarUrl 的内容。这就很坑了对吧。

而且很神奇的是在本地调试调用这个云函数的时候,userInfo 还是他该有的样子。但一到云端的时候这个函数获取到 userInfo 就变了。(下图)

20190723003259-image.png

怎么解决呢。很简单,和原来的服务端解密小程序的用户数据 aes 加密算法时一样,传一个 rawData 就好了。
只不过现在不需要那么复杂的解密,只用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# login/index.js
exports.main = (event, context) => {
let {
rawData,
} = event
let userInfo = JSON.parse(rawData)
const wxContext = cloud.getWXContext()
let {
OPENID,
} = wxContext
return {
openid: OPENID,
userInfo,
msg: '注册成功',
errCode: 0,
}
}

关键是这个坑官方文档里还没有写出来。

积分增加

credit 这个东西呢,怎么实现呢。

首先他需要一张表。
这个表就放 用户 和 积分的关系
当然 也可以直接放到用户表里。

小程序的云开发里的表是一种 json 数据库,每条记录以 json 对象的形式保存在某个位置。类似于保存本地 storage 一样的东西。

关系型 文档型

数据库 database |数据库 database
表 table |集合 collection
行 row |记录 record / doc
列 column |字段 field

user 对应了一个积分,积分的增减还会反应在一个 log 表里。so,实现方式就有很多种了。 在这里我们提前封装好了以下:(详细功能可以在 readme 开发文档里看到。)

  • request
  • cloud
  • db

在这里没有前后端分离的话就直接在每次提交问题, 回答问题(跳过审核步骤之后直接对 credit 进行加减,并同时更新 log 表。)

可能这个会有很多问题。但目前来说实现起来最简单。

所以在需要增减积分的地方发送这个请求就行啦:

1
2
// 添加积分
util.addCredit('question')

积分兑换

兑换资源就是指兑换客服后台上传的文件。
兑换一个文件耗费一个积分。

一个商城的界面,emmmmm 就 ListView 吧,放在一个 tab 里。

然后就是商城的数据结构呢?

bonus

id name price createdAt discount image content
1 瘦子 20 jintian 100 没有图片 内容,会被加密,未兑换情况下不返回内容

redeem log

id bonus user _openid' changeCredit remindCredit createdAt
1 1 1 xxxx 1 10 2019-10-01 xx

兑换一次就增加一个 redeem log

相应的积分就要减少 credit_loguser 都要修改。

不过 tcb 只提供了 NoSQL 数据库 就很尴尬,没法在获取 bonus 列表中一次查询中返回用户是否兑换过。只能同时 查一下 redeem log 再来整合。

云存储的调用

云存储的文件会给你一个 以 cloud:// 开头的值,和普通 https://开头的值一样,放到 image 的 src 里就好。

,