小程序云开发实战 - 体重记录小程序 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
如果想在 V2EX 获得更好的推广效果,欢迎了解 PRO 会员机制:
pro/about
CloudBase

小程序云开发实战 - 体重记录小程序

  •  
  •   CloudBase 2019 年 8 月 5 日 1965 次点击
    这是一个创建于 2454 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前一段看到朋友圈里总是有人用 txt 记录体重,就特别想写一个记录体重的小程序, 现在小程序的云开发有云函数、数据库,真的挺好用,很适合个人开发者,服务器域名什么都不用管,云开发让你完全不用操心这些东西。

    先看看页面效果图吧:

    记录的几个点:

    1.全局变量 globalData

    2.npm 的使用

    3.云函数

    4.数据库操作

    5.async 的使用

    6.分享的配置

    7.antV 使用

    8.tabBar 地址跳转

    9.切换页面刷新

    1.全局变量 globalData

    首次进入后,要存储 openId 给其他页面使用,使用 globalData 共享。

    <!--app.js 设置 globalData.openid --> App({ onLaunch: function () { this.globalData = {} wx.cloud.init({}) wx.cloud.callFunction({ name: 'login', data: {}, success: res => { this.globalData.openid = res.result.openid wx.switchTab({ url: '/pages/add/add', fail: function(e) {} }) }, fail: err => { } }) } }) <!--其他页面引用--> const app = getApp() // 获得实例 app.globalData.openid // 直接引用即可 

    2.npm 的使用

    1.进入小程序源码miniprogram 目录,创建 package.json 文件(使用 npm init 一路回车)

    2.npm i --save 我们要安装的 npm

    3.设置微信开发者工具 构建 npm

    4.package.json 增加 "miniprogram": "dist" 打包目录字段,如果不设置的话上传和预览不成功,提示文件包过大。

    cd miniprogram npm init npm i @antv/f2-canvas --save // 我用到了 f2,可以换成其他包 

    设置微信开发者工具

    构建 npm

    最后,务必添加 miniprogram 字段

    { "name": "21Day", "version": "1.1.0", "miniprogram": "dist", "description": "一个 21 天体重记录的 app", "license": "MIT", "dependencies": { "@antv/f2-canvas": "~1.0.5", "@antv/wx-f2": "~1.1.4" }, "devDependencies": {} } 

    3.云函数

    官方解释 云函数即在云端(服务器端)运行的函数 ,服务端是 node.js ,都是 Javascript 。官方有数据库的操作,但是更新的操作强制要求使用云函数, 另外,如果云函数中使用了 npm 包,记得在所在云函数文件夹右键上传并部署,不然运行失败。

    上一个例子,更新体重的云函数

    // 云函数 const cloud = require('wx-server-sdk') const moment = require('moment') cloud.init( { traceUser: true } ) const db = cloud.database() const wxCOntext= cloud.getWXContext() exports.main = async (event, context) => { // event 入参参数 delete event.userInfo try { return await db.collection('list').where({ _openid:wxContext.OPENID, date:moment().format('YYYY-MM-DD') }) .update({ data: { ...event }, }) } catch(e) { console.error(e) } } 

    小程序端调用

    wx.cloud.callFunction({ name: 'add', data: { ...Param }, success: res => { wx.showToast({ title: '新增记录成功', }) }, fail: err => { wx.showToast({ icon: 'none', title: '新增记录失败' }) } }) 

    4.数据库操作

    其实是接入的 MongoDB ,封装了一部分 api 出来,详细的就看官方文档吧,有区分服务端和小程序段。

    const db = wx.cloud.database() // 查询数据 db.collection('list').where({ _openid: app.globalData.openid, date: moment().subtract(1, 'days').format('YYYY-MM-DD'), }).get({ success: function (res) { // do someThing } }) 

    5.async 的使用

    官方文档提示不支持 async,需要引入 regeneratorRuntime 这个包,先 npm i regenerator 。 然后把 node_modules 文件夹下的 regenerator-runtimeruntime-module.jsruntime.js 两个文件拷贝到 lib 目录下,在页面上引入即可。

    <!--事例--> const regeneratorRuntime = require('../../lib/runtime.js') onLoad: async function (options) { // 获取当天数据 await this.step1() // 时间类型设置 let nowHour = moment().hour(),timeType nowHour > 12 ? timeType = 'evening' : timeType = 'morning' this.setData({timeType}) } 

    6.分享的配置

    分享很简单,有区分右上角的直接分享和点击按钮分享

    onShareAppMessage: function (res) { // 右上角分享 let ShareOption = { title: '21 天体重减肥记录', path: '/pages/index/index', } // 按钮分享 if(res.from == "button"){ ShareOption = { title: '来呀 看看我的减肥记录呀', path: '/pages/detail/detail?item=' + app.globalData.openid, } } return ShareOption } 

    分享后,他人点击页面,跳转到对应 pages 地址,从 onLoadoptions中拿入参请求数即可

    onLoad: function (options) { const db = wx.cloud.database() let This = this let resault = {} db.collection('list').where({ _openid: options.item }).get({ success: function (res) { resault = res.data This.setData({ resault:resault }) } }) }, 

    7.antV 使用

    上边第二小节有提到 antV 的安装,就不再赘述,直接说一下再页面中引用。

    说下使用,需要设置一个全局变量储存图表的实例,然后在钩子函数内容使用 changeData 方法修改数据。

    index.json 中引入包名

    { "usingComponents": { "ff-canvas": "@antv/f2-canvas" } } 
    // 引入 F2 import F2 from '@antv/wx-f2'; // 设置实例全局变量(务必) let chart = null; function initChart(canvas, width, height, F2) { // 使用 F2 绘制图表 let data = [ // { timestamp: '1951 年', step: 38 }, ]; chart = new F2.Chart({ el: canvas, width, height }); chart.source(data, { step: { tickCount: 5 }, timestamp: { tickCount: 8 }, }); chart.axis('timestamp', { label(text, index, total) { const textCfg = {}; if (index === 0) { textCfg.textAlign = 'left'; } if (index === total - 1) { textCfg.textAlign = 'right'; } return textCfg; } }); chart.axis('step', { label(text) { return { text: text / 1000 + 'k 步' }; } }); chart.tooltip({ showItemMarker: false, onShow(ev) { const { items } = ev; items[0].name = null; items[0].name = items[0].title; items[0].value = items[0].value + '步'; } }); chart.area().position('timestamp*step').shape('smooth').color('l(0) 0:#F2C587 0.5:#ED7973 1:#8659AF'); chart.line().position('timestamp*step').shape('smooth').color('l(0) 0:#F2C587 0.5:#ED7973 1:#8659AF'); chart.render(); return chart; } // 生命周期函数 onLoad(){ // 使用 changeData 赋值 chart.changeData(stepInfoList) } 

    8.tabBar 地址跳转

    如果要跳转的地址不在 app.jsontabBar 内可以使用 wx.navigateTo ,如果在死活跳不过去,要使用wx.switchTab 方法跳转。

    wx.switchTab({ url: '/pages/add/add', fail: function(e) {} }) wx.navigateTo({ url: '../deployFunctions/deployFunctions', }) 

    9.切换页面刷新

    切换几个 tabBar 的时候,需要刷新数据。 在 onShow 方法中再调用一下 onLoad 方法就可以了。

    onShow: function () { this.onLoad() } 

    源码链接

    https://github.com/TencentCloudBase/Good-practice-tutorial-recommended


    如果你有关于使用云开发 CloudBase 相关的技术故事 /技术实战经验想要跟大家分享,欢迎留言联系我们哦~比心!

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3869 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 78ms UTC 00:16 PVG 08:16 LAX 17:16 JFK 20:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86