前言
随着网盘、音乐网站、购物网站皆推出了会员服务,我们每个月花在会员上的钱,可能比我们想象的还要多。于是,如何管理这些固定支出便成了一个问题。目前市面上已经有了一些不错的解决方案,比如『Bobby App』,但是其免费版只能添加 5 个订阅,而且对国内常用服务的支持也有限。
于是便有了『Moly 订阅助手』,这个小程序的初衷就是想要帮助大家更好、更方便地管理每月的固定支出。同时,借助微信小程序这个平台,真正做到『随到随用』。
值得一提的是,由于小程序·云开发的帮助,省去了大量搭建后端服务器的时间,从有这个想法到最终小程序上架只花了 5天 的时间。
产品逻辑
『Moly 订阅管家』的主要功能很简单:
1、用户添加订阅
2、首页展示订阅
3、后端自动计算每月平均支出
感兴趣的可以扫码体验一下~
下面将详细说明:如何在不自行搭建服务器的情况下,借助小程序·云开发实现这个小程序。
云开发介绍
关于云开发是什么,官方文档里说的很清楚:
云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 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的?
人人都能看懂的云计算知识科普!
程序员如何从菜鸟工程师到高级架构师?
关注云加社区,回复 3 加读者群
好文!给你“ 好看”