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


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

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

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

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

开始

前端

小程序:UI看图就好了。

image.png

订阅页面

image.png

云函数:

image.png

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

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

image.png

然后fcs就有了云的图标。

右键就可以新建云函数。

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

// 云函数入口文件

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,

}

}

右键上传部署云端。

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

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

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

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函数如何操作数据库的。

// 云函数入口文件

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等 * 代表每

{
  
  "permissions": {
    "openapi": [
      "subscribeMessage.send"
    ]
  },
  "triggers": [
    {
     
      "name": "order",
     
      "type": "timer",
      
      "config" : "0 30 08 * * * *"
    }
  ]
}

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

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. 这里用到了云函数调用其它云函数,比如我们先拿到订阅用户列表,这里和小程序端是一样的用法。

let users =  (await cloud.callFunction({

name:  'quote-users'

})).result;

然后遍推送:

for(let i of users){

console.log(i);

//推送

cloud.openapi.subscribeMessage.send({

xxxxxx

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

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

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

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

export1580025300148.jpg

云开发后台

image.png


文章作者: 2winter
文章链接: https://2winter.com
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 2winter !