【云开发】使用微信的云开发完成brainyquote小程序的完整前后端开发

过年这几天写了一个小程序,练手云开发,因为之前用过几次Node.js想到云开发也支持,就试试了,反正微信免费的额度也够了。
涉及的内容

注意几个坑啊:云函数配置文件加上权限列表,订阅消息和模板消息不一样。

  • 云函数
  • 云数据库
  • 定时任务
  • 订阅消息

小程序简介:
我这里小程序后端是Node.js写的爬虫(用的云开发)
提供brainyquote每日的英文推荐,支持搜索,订阅每日推送。

开始

前端

小程序:UI看图就好了。

image.png

订阅页面

image.png

云函数:

image.png

开始引入云函数:首先建立一个文件夹用来放云函数(其实就是一个云端的Node.js函数)。

我的是 fcs 然后你需要在项目配置文件里加上这个目录:

image.png

然后fcs就有了云的图标。

右键就可以新建云函数。

看一个最基本的云函数,也会用到,获取用户的openid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 云函数入口文件

const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数

exports.main = async (event, context) => {
//云函数自带openid参数,你可以直接用
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,

appid: wxContext.APPID,

unionid: wxContext.UNIONID,

}

}

右键上传部署云端。

我们在小程序端调用一下看看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
wx.cloud.callFunction({

name: "quote-openid"

}).then((res) => {

console.log('openid')

console.log(res.result);

this.setData({

userInfo: res.result

})

}).catch((error) => {

wx.showToast({

title: 'load Failed',

})

})

可以看到是一个Promise的函数。用的wx.cloud.callFunction()来调用我们的云函数,这里注意你的云环境要提前初始化,我在app.js初始化的:wx.cloud.init()

如果你想给云函数加参数:xxcallFunction({data:{xxxx}}),云函数里面用event.xx来使用。

我们的数据都是通过云函数提供的,其实就是几个node.js爬虫,用的requests和cheerio模块。写完云函数,可以本地部署测试一下。

这里不说node了,可以去看一下文档,有js基础,很容易。

现在拿到数据,小程序基本可以用了,但是,我们要做的个性化啊,比如搜索:用到了云函数加参数,上面说了。

更进一步,我们加个订阅消息,每天给用户推送一句英文语录。

先去小程序后台添加一个消息模板,拿到模板ID后。

requestSubscribeMessage

申请订阅消息,我写到工具模块了,可以直接用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
const order =  function(db,openid){

wx.requestSubscribeMessage({

tmplIds: ['模板ID'],

success(res) {

// console.log(res);

if (res['模板ID'] === 'accept') {

//先检查有没有订阅过

//更新

console.log('开始更新订阅记录')
//这里有一个云函数sub是用来添加订阅记录放到数据库的,因为安全性,只能在后端处理数据库更新
wx.cloud.callFunction({

name: "quote-sub"

}).then((res) => {

if (res.result.errMsg === 'collection.update:ok'){

console.log('更新订阅记录ok')

wx.showToast({

title: '订阅成功',

});

}else{

console.log('订阅成功,记录更新错误!')

console.log(res);

}

}).catch((error) => {

console.log('更新订阅记录失败')

wx.showToast({

title: 'load Failed',

})

})





} else {

//未订阅过

console.log('未订阅过')

db.collection('users').add({

data: {



order: 1

}

}).then((res) => {

console.log(res)

})

}



}

})



} else {

wx.showToast({

title: '订阅失败',

})

}

},

fail(res) {

console.log(res)

wx.showToast({

title: '订阅失败',

})

}

})

};



module.exports = {

order:order

}

看看sub函数如何操作数据库的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 云函数入口文件

const cloud = require('wx-server-sdk')
cloud.init()
//初始化数据库,这里和小程序端区别是有权限更新,编辑,添加
const db = cloud.database()

// 云函数入口函数

exports.main = async (event, context) => {

const wxContext = cloud.getWXContext()

//这是SDK提供的工具函数,类似于mysql的函数
const _ = db.command

let status = await db.collection('users').where({ _openid: wxContext.OPENID }).update({

data: {
//给订阅记录加一
order: _.inc(1)

}

})
//返回订阅结果
return status

}

订阅完成后,处理定时任务推送:要使用定时任务,需要在这个云函数的文件里加一个config.json的文件,填写一下配置,注意不可以有注释,不然提醒你部署触发器一直失败!

Cron语法,可以百度,微信官方也有说明,秒 分 时 xxx等 * 代表每

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
```
{

"permissions": {
"openapi": [
"subscribeMessage.send"
]
},
"triggers": [
{

"name": "order",

"type": "timer",

"config" : "0 30 08 * * * *"
}
]
}
1
2
3
4


添加一个新的云函数,调用订阅消息接口,这里是官方示例,注意模板字段格式!

const cloud = require(‘wx-server-sdk’)
cloud.init()
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.subscribeMessage.send({
touser: ‘OPENID’,
page: ‘index’,
data: {
number01: {
value: ‘339208499’
},
date01: {
value: ‘2015年01月05日’
},
site01: {
value: ‘TIT创意园’
},
site02: {
value: ‘广州市新港中路397号’
}
},
templateId: ‘TEMPLATE_ID’
})
console.log(result)
return result
} catch (err) {
console.log(err)
return err
}
}

1
2
3

我们要做的就是定时,循环给订阅的用户推送最新的英文语录,并且,记录减去1. 这里用到了云函数调用其它云函数,比如我们先拿到订阅用户列表,这里和小程序端是一样的用法。

let users = (await cloud.callFunction({

name: ‘quote-users’

})).result;

1
2
3

然后遍推送:

for(let i of users){

console.log(i);

//推送

cloud.openapi.subscribeMessage.send({

xxxxxx


完成后,右键云函数:部署云端,部署触发器。

如果觉得没底,可以把cron改成5s的,先测试一下,或者手动触发调试。

---由于过年了,小程序还没审核完成,想体验一下的小伙伴,可以回复公众号:秋果科技工作室:quote 申请体验。


已经上线:微信搜索小程序:brainyquoteLite即可。

![export1580025300148.jpg](https://img.hacpai.com/file/2020/01/export1580025300148-ec5b0927.jpg)


云开发后台

![image.png](https://img.hacpai.com/file/2020/01/image-7e656469.png)