link 自定义触发器 定时触发_云开发定时触发器应用实战 I Moly 订阅助手小程序...

前言

随着网盘、音乐网站、购物网站皆推出了会员服务,我们每个月花在会员上的钱,可能比我们想象的还要多。于是,如何管理这些固定支出便成了一个问题。目前市面上已经有了一些不错的解决方案,比如『Bobby App』,但是其免费版只能添加 5 个订阅,而且对国内常用服务的支持也有限。

于是便有了『Moly 订阅助手』,这个小程序的初衷就是想要帮助大家更好、更方便地管理每月的固定支出。同时,借助微信小程序这个平台,真正做到『随到随用』。

值得一提的是,由于小程序·云开发的帮助,省去了大量搭建后端服务器的时间,从有这个想法到最终小程序上架只花了 5天 的时间。

产品逻辑

『Moly 订阅管家』的主要功能很简单:

1、用户添加订阅

2、首页展示订阅

3、后端自动计算每月平均支出

感兴趣的可以扫码体验一下~

5a8b9186f37e783a13706e04128401cd.png

下面将详细说明:如何在不自行搭建服务器的情况下,借助小程序·云开发实现这个小程序。

云开发介绍

关于云开发是什么,官方文档里说的很清楚:

云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代

其实,云开发本质上就是近来流行的 serverless 的概念——无需搭建服务器,运维那些事全部都交给腾讯云的专业团队去做,省时省心。同时,云开发提供了完整的云端支持,包括:云函数、数据库和文件存储。

借助云开发的帮助,只需一名合格的前端,即可胜任整个小程序的开发工作。

云开发分为两块:小程序端和服务端。

小程序端负责调用,包括开发者自定义的云函数,以及云开发内置的用于访问云数据库和静态存储的 API。

服务端负责核心的业务逻辑处理,通过云函数这一载体实现。云函数中可以得到请求的上下文,访问数据库,实现数据库的增删改查。

开始使用

温馨提示,文章将从实战步骤为大家娓娓道来,希望直接了解定时触发器应用的亲,可以直接跳到步骤五哦~

关于如何开发使用云开发,篇幅原因,这里就不再赘述,可以参考《小程序·云开发官方文档》。

对于已经存在的项目,需要在 project.config.json 文件中添加字段: "cloudfunctionRoot":"cloudfunctions/" 来指定云函数目录。在 app.json / game.json 中增加字段 "cloud":true 来做云开发的兼容性处理。

一、通过云函数实现用户鉴权

用户登录、注册这一块对于个人开发者来说一直是个老大难的问题,需要考虑的因素尤其多,一不小心就可能出现安全风险。不过,借助云开发,我们可以轻松实现用户鉴权。

上文我们提到,通过云函数可以得到请求的上下文,这其中就包括可信任的用户登录态 openid,基于 openid 我们就可以轻松地实现用户鉴权。另外,这样做还有一个额外的好处:无需用户授权登录,保护用户隐私,真正做到『随到随用、随用随走』。

App.js

App({

onLaunch() {

wx.cloud.init({

traceUser: true, // 将用户访问记录到用户管理中,在控制台中可见

})

},

})

二、通过云函数实现【添加订阅】功能

首先,我们需要新建一个云开发数据库。

云开发数据库是基于 JSON 的,熟悉 MongoDB 的同学用起来应该不陌生,不清楚的同学可以参考云开发的官方文档。

在微信开发者工具中点击『云开发』->『数据库』选项页 -> 添加集合,集合名为 subscriptions

然后,创建处理『用户添加订阅』的云函数。

右键点击云函数目录,选择『新建 Node.js 云函数』,目录名为 addUserSubscription。修改云函数入口文件 main.js 如下:

const cloud = require('wx-server-sdk')

cloud.init()

const db = cloud.database()

// 云函数入口函数

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

const wxContext = cloud.getWXContext()

const openid = wxContext.OPENID

const { data } = event

return db.collection('subscriptions').add({

data: Object.assign(data, { _openid: openid })

})

}

三、通过云函数实现【查询订阅】功能

右键点击云函数目录,选择『新建 Node.js 云函数』,目录名为 getUserSubscriptions。修改云函数入口文件 main.js 如下:

const cloud = require('wx-server-sdk')

cloud.init()

const db = cloud.database()

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

const wxContext = cloud.getWXContext()

const openid = wxContext.OPENID

return db.collection('subscriptions').where({

_openid: openid

}).get()

}

编写完云函数之后,我们需要部署云函数以使其生效。云开发的妙处也正在此,只需右键点击云函数目录,选择『上传并部署』即可一键部署后端代码。简单优雅,方便快捷。

四、小程序端调用

上传并部署云函数后,我们可以在小程序中这样调用:

Page({

data: {

subscriptions: []

},

onLoad() {

wx.cloud.callFunction({

name: 'getUserSubscriptions',

})

.then(res => this.setData({

subscriptions: res.result.data

}))

.catch(console.log)

}

})

这样,我们就能得到当前用户订阅的所有服务了。是不是很方便呢?

五、利用云函数实现多币种支持

可想而知,对于订阅管理,多币种支持是不可或缺的,毕竟并不是所有订阅都是以人民币结算嘛。那么如何去处理汇率的问题呢?这里给出我的实现方案。

首先,汇率不是股票,随时间的波动性并不强。因此,我们可以把汇率信息存在数据库中,然后定时去更新它即可。

1、通过定时触发实现【定期更新】

幸运的是,通过云函数定时触发器,我们可以很方便的实现定时触发云函数,从而更新数据库中的汇率信息。

首先我们先来了解一下【定时触发器】的使用场景,官方文档是这么说的:

如果云函数需要定时/定期执行,即定时触发,您可以使用云函数定时触发器。已配置定时触发器的云函数,会在相应时间点被自动触发,函数的返回结果不会返回给调用方。

个人觉得定时触发器和 Linux 中的 crontab 定时任务很类似。利用定时触发器,我们可以指定某个程序在特定时间点执行,通过定义时间表来控制执行的频率,实现自动化处理。

所以,我们可以新建一个云函数 updateExchangeRate,然后在目录下新建 config.json 文件,修改如下:

{

"triggers": [

{

"name": "updateCurrencyDaily",

"type": "timer",

"config": "0 0 */2 * * * *" // 每两个小时触发一次,类似 crontab

}

]

}

这样就完成汇率定时更新功能了。

2、获取汇率数据

这里我使用的是 Alpha Vantage 提供的汇率接口,免费无限制,实时更新。

const cloud = require('wx-server-sdk')

const fetch = require('node-fetch')

cloud.init()

const db = cloud.database()

const API_KEY = 'SECRET'

const BASE_URL = `https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE&to_currency=CNY&apikey=${API_KEY}`

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

const supportCurrencyList = ['USD', 'JPY', 'EUR', 'GBP', 'HKD', 'AUD']

const toCNY = {}

for (const currency of supportCurrencyList) {

const rate = await fetch(`${BASE_URL}&from_currency=${currency}`)

.then(res => res.json())

.then(res => res['Realtime Currency Exchange Rate']['5. Exchange Rate'])

toCNY[currency] = parseFloat(rate)

}

return db.collection('currency').doc('some_id')

.update({

data: Object.assign(toCNY, {date: new Date()})

})

}

注意,由于这里我们使用了 fetch,我们需要引入 node-fetch 这个依赖库。

引入的方法也很简单,只需在目录下的 package.json 文件中的 dependencies 字段新加一行 "node-fetch":"^2.3.0" 即可。上传时选择『云端安装依赖』即可自动安装相关依赖。当然也可以直接在命令行运行 npm i node-fetch 安装。

结语

相信通过上面的例子,各位已经对『云开发是什么』、『如何使用云开发』以及『定时触发器』有个大概的印象了。希望可以帮助到大家,觉得写得不错的记得给作者点个赞,你们的支持是我创造的最大动力!

推荐阅读:

都40岁了还在敲代码,想哭!

腾讯云是如何做原生Devops的?

人人都能看懂的云计算知识科普!

程序员如何从菜鸟工程师到高级架构师?

982307485baa2925998e3399bd94c8da.png

关注云加社区,回复 3 加读者群

好文!给你“ 好看”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值